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 2017/12/12 15:18:19 UTC

[01/18] hbase-site git commit: Published site at .

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site f2c790b70 -> 1473a64a7


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
index 06992c4..f5e1b5f 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
@@ -26,199 +26,226 @@
 <span class="sourceLineNo">018</span> */<a name="line.18"></a>
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.regionserver;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import org.apache.commons.logging.Log;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.commons.logging.LogFactory;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hadoop.conf.Configuration;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.fs.FileSystem;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.fs.Path;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.*;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.client.*;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.junit.Assert;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.junit.Rule;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.junit.Test;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.junit.experimental.categories.Category;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.junit.rules.TestName;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.io.IOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.ArrayList;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import java.util.List;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import java.util.concurrent.CountDownLatch;<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> * Test for HBASE-17471<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * path. Other write paths like increment/append still assign mvcc in ringbuffer's consumer<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * thread. If put and increment are used parallel. Then seqid in WAL may not increase monotonically<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * Disorder in wals will lead to data loss.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * This case use two thread to put and increment at the same time in a single region.<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * Then check the seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail<a name="line.54"></a>
-<span class="sourceLineNo">055</span> *<a name="line.55"></a>
-<span class="sourceLineNo">056</span> */<a name="line.56"></a>
-<span class="sourceLineNo">057</span>@Category({RegionServerTests.class, SmallTests.class})<a name="line.57"></a>
-<span class="sourceLineNo">058</span>public class TestWALMonotonicallyIncreasingSeqId {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  final Log LOG = LogFactory.getLog(getClass());<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir = TEST_UTIL.getDataTestDir("TestWALMonotonicallyIncreasingSeqId");<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private WALFactory wals;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private FileSystem fileSystem;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private Configuration walConf;<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static final String KEY_SEED = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private static final int KEY_SEED_LEN = KEY_SEED.length();<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private static final char[] KEY_SEED_CHARS = KEY_SEED.toCharArray();<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @Rule<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public TestName name = new TestName();<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private HTableDescriptor getTableDesc(TableName tableName, byte[]... families) {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    for (byte[] family : families) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      // Set default to be three versions.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      hcd.setMaxVersions(Integer.MAX_VALUE);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      htd.addFamily(hcd);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    return htd;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private Region initHRegion(HTableDescriptor htd, byte[] startKey, byte[] stopKey, int replicaId)<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      throws IOException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    conf.setBoolean("hbase.hregion.mvcc.preassign", false);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), startKey, stopKey, false, 0, replicaId);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    fileSystem =  tableDir.getFileSystem(conf);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    HRegionFileSystem fs = new HRegionFileSystem(conf, fileSystem, tableDir, info);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    final Configuration walConf = new Configuration(conf);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    FSUtils.setRootDir(walConf, tableDir);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    this.walConf = walConf;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    wals = new WALFactory(walConf, null, "log_" + replicaId);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    HRegion region = HRegion.createHRegion(info, TEST_UTIL.getDefaultRootDirPath(), conf, htd,<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        wals.getWAL(info.getEncodedNameAsBytes(), info.getTable().getNamespace()));<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return region;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  CountDownLatch latch = new CountDownLatch(1);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  public class PutThread extends Thread {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    HRegion region;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public PutThread(HRegion region) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      this.region = region;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public void run() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      try {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        for(int i = 0; i &lt; 100; i++) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>          byte[] row = Bytes.toBytes("putRow" + i);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>          Put put = new Put(row);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          put.addColumn("cf".getBytes(), Bytes.toBytes(0), Bytes.toBytes(""));<a name="line.118"></a>
-<span class="sourceLineNo">119</span>          //put.setDurability(Durability.ASYNC_WAL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          latch.await();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          region.batchMutate(new Mutation[]{put});<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          Thread.sleep(10);<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">021</span>import static org.junit.Assert.fail;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.ArrayList;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.concurrent.CountDownLatch;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.commons.logging.Log;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.commons.logging.LogFactory;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.Path;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<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.TableName;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Put;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.After;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.AfterClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.Before;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Rule;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.Test;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.experimental.categories.Category;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.rules.TestName;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.runner.RunWith;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.runners.Parameterized;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.runners.Parameterized.Parameter;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.runners.Parameterized.Parameters;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * Test for HBASE-17471.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete path. Other<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * write paths like increment/append still assign mvcc in ringbuffer's consumer thread. If put and<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * increment are used parallel. Then seqid in WAL may not increase monotonically Disorder in wals<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * will lead to data loss.<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * This case use two thread to put and increment at the same time in a single region. Then check the<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail<a name="line.74"></a>
+<span class="sourceLineNo">075</span> */<a name="line.75"></a>
+<span class="sourceLineNo">076</span>@RunWith(Parameterized.class)<a name="line.76"></a>
+<span class="sourceLineNo">077</span>@Category({ RegionServerTests.class, SmallTests.class })<a name="line.77"></a>
+<span class="sourceLineNo">078</span>public class TestWALMonotonicallyIncreasingSeqId {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final Log LOG = LogFactory.getLog(getClass());<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static Path testDir = TEST_UTIL.getDataTestDir("TestWALMonotonicallyIncreasingSeqId");<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private WALFactory wals;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private FileSystem fileSystem;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private Configuration walConf;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private HRegion region;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Parameter<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public String walProvider;<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Parameters(name = "{index}: wal={0}")<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static List&lt;Object[]&gt; data() {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return Arrays.asList(new Object[] { "asyncfs" }, new Object[] { "filesystem" });<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private TableDescriptor getTableDesc(TableName tableName, byte[]... families) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    Arrays.stream(families).map(<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      f -&gt; ColumnFamilyDescriptorBuilder.newBuilder(f).setMaxVersions(Integer.MAX_VALUE).build())<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        .forEachOrdered(builder::addColumnFamily);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return builder.build();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private HRegion initHRegion(TableDescriptor htd, byte[] startKey, byte[] stopKey, int replicaId)<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      throws IOException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    conf.set("hbase.wal.provider", walProvider);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    conf.setBoolean("hbase.hregion.mvcc.preassign", false);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    RegionInfo info = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(startKey)<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        .setEndKey(stopKey).setReplicaId(replicaId).setRegionId(0).build();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    fileSystem = tableDir.getFileSystem(conf);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    final Configuration walConf = new Configuration(conf);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    FSUtils.setRootDir(walConf, tableDir);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    this.walConf = walConf;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    wals = new WALFactory(walConf, null, "log_" + replicaId);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    HRegion region = HRegion.createHRegion(info, TEST_UTIL.getDefaultRootDirPath(), conf, htd,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      wals.getWAL(info.getEncodedNameAsBytes(), info.getTable().getNamespace()));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return region;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
 <span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>      } catch (Throwable t) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        LOG.warn("Error happend when Increment: ", t);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public class IncThread extends Thread {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    HRegion region;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public IncThread(HRegion region) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.region = region;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    public void run() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      try {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        for(int i = 0; i &lt; 100; i++) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          byte[] row = Bytes.toBytes("incrementRow" + i);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          Increment inc = new Increment(row);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          inc.addColumn("cf".getBytes(), Bytes.toBytes(0), 1);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          //inc.setDurability(Durability.ASYNC_WAL);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          region.increment(inc);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          latch.countDown();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          Thread.sleep(10);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } catch (Throwable t) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        LOG.warn("Error happend when Put: ", t);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
+<span class="sourceLineNo">126</span>  CountDownLatch latch = new CountDownLatch(1);<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public class PutThread extends Thread {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    HRegion region;<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    public PutThread(HRegion region) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.region = region;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    public void run() {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      try {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        for (int i = 0; i &lt; 100; i++) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          byte[] row = Bytes.toBytes("putRow" + i);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          Put put = new Put(row);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          put.addColumn("cf".getBytes(), Bytes.toBytes(0), Bytes.toBytes(""));<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          latch.await();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          region.batchMutate(new Mutation[] { put });<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          Thread.sleep(10);<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>      } catch (Throwable t) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        LOG.warn("Error happend when Increment: ", t);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public class IncThread extends Thread {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    HRegion region;<a name="line.154"></a>
 <span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Test<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public void TestWALMonotonicallyIncreasingSeqId() throws Exception {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    byte[][] families = new byte[][] {Bytes.toBytes("cf")};<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    byte[] qf = Bytes.toBytes("cq");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    HTableDescriptor htd = getTableDesc(TableName.valueOf(name.getMethodName()), families);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    HRegion region = (HRegion)initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    List&lt;Thread&gt; putThreads = new ArrayList&lt;&gt;();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    for(int i = 0; i &lt; 1; i++) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      putThreads.add(new PutThread(region));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    IncThread incThread = new IncThread(region);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    for(int i = 0; i &lt; 1; i++) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      putThreads.get(i).start();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    incThread.start();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    incThread.join();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    Path logPath = ((FSHLog) region.getWAL()).getCurrentFileName();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    region.getWAL().rollWriter();<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Thread.sleep(10);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Path hbaseDir = new Path(walConf.get(HConstants.HBASE_DIR));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    Path oldWalsDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    WAL.Reader reader = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      reader = wals.createReader(fileSystem, logPath);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    } catch (Throwable t) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      reader = wals.createReader(fileSystem, new Path(oldWalsDir, logPath.getName()));<a name="line.185"></a>
+<span class="sourceLineNo">156</span>    public IncThread(HRegion region) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      this.region = region;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    public void run() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      try {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        for (int i = 0; i &lt; 100; i++) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          byte[] row = Bytes.toBytes("incrementRow" + i);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          Increment inc = new Increment(row);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          inc.addColumn("cf".getBytes(), Bytes.toBytes(0), 1);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          // inc.setDurability(Durability.ASYNC_WAL);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          region.increment(inc);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>          latch.countDown();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          Thread.sleep(10);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>      } catch (Throwable t) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        LOG.warn("Error happend when Put: ", t);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Before<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void setUp() throws IOException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    byte[][] families = new byte[][] { Bytes.toBytes("cf") };<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    TableDescriptor htd = getTableDesc(<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      TableName.valueOf(name.getMethodName().replaceAll("[^0-9A-Za-z_]", "_")), families);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    region = initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0);<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>    WAL.Entry e;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      long currentMaxSeqid = 0;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      while ((e = reader.next()) != null) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        if (!WALEdit.isMetaEditFamily(e.getEdit().getCells().get(0))) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>          long currentSeqid = e.getKey().getSequenceId();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          if(currentSeqid &gt; currentMaxSeqid) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            currentMaxSeqid = currentSeqid;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          } else {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            Assert.fail("Current max Seqid is " + currentMaxSeqid<a name="line.197"></a>
-<span class="sourceLineNo">198</span>                + ", but the next seqid in wal is smaller:" + currentSeqid);<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>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } finally {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if(reader != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        reader.close();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if(region != null) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        region.close();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<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">187</span>  @After<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public void tearDown() throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (region != null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      region.close();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @AfterClass<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public static void tearDownAfterClass() throws IOException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    TEST_UTIL.cleanupTestDir();<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private WAL.Reader createReader(Path logPath, Path oldWalsDir) throws IOException {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      return wals.createReader(fileSystem, logPath);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    } catch (IOException e) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      return wals.createReader(fileSystem, new Path(oldWalsDir, logPath.getName()));<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  @Test<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public void testWALMonotonicallyIncreasingSeqId() throws Exception {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    List&lt;Thread&gt; putThreads = new ArrayList&lt;&gt;();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    for (int i = 0; i &lt; 1; i++) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      putThreads.add(new PutThread(region));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    IncThread incThread = new IncThread(region);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    for (int i = 0; i &lt; 1; i++) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      putThreads.get(i).start();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    incThread.start();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    incThread.join();<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    Path logPath = ((AbstractFSWAL&lt;?&gt;) region.getWAL()).getCurrentFileName();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    region.getWAL().rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    Thread.sleep(10);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    Path hbaseDir = new Path(walConf.get(HConstants.HBASE_DIR));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Path oldWalsDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    try (WAL.Reader reader = createReader(logPath, oldWalsDir)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      long currentMaxSeqid = 0;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      for (WAL.Entry e; (e = reader.next()) != null;) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (!WALEdit.isMetaEditFamily(e.getEdit().getCells().get(0))) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          long currentSeqid = e.getKey().getSequenceId();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          if (currentSeqid &gt; currentMaxSeqid) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>            currentMaxSeqid = currentSeqid;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          } else {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            fail("Current max Seqid is " + currentMaxSeqid +<a name="line.233"></a>
+<span class="sourceLineNo">234</span>              ", but the next seqid in wal is smaller:" + currentSeqid);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>}<a name="line.240"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
index 06992c4..f5e1b5f 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
@@ -26,199 +26,226 @@
 <span class="sourceLineNo">018</span> */<a name="line.18"></a>
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.regionserver;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import org.apache.commons.logging.Log;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.commons.logging.LogFactory;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hadoop.conf.Configuration;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.fs.FileSystem;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.fs.Path;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.*;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.client.*;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.junit.Assert;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.junit.Rule;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.junit.Test;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.junit.experimental.categories.Category;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.junit.rules.TestName;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.io.IOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.ArrayList;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import java.util.List;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import java.util.concurrent.CountDownLatch;<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> * Test for HBASE-17471<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * path. Other write paths like increment/append still assign mvcc in ringbuffer's consumer<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * thread. If put and increment are used parallel. Then seqid in WAL may not increase monotonically<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * Disorder in wals will lead to data loss.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * This case use two thread to put and increment at the same time in a single region.<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * Then check the seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail<a name="line.54"></a>
-<span class="sourceLineNo">055</span> *<a name="line.55"></a>
-<span class="sourceLineNo">056</span> */<a name="line.56"></a>
-<span class="sourceLineNo">057</span>@Category({RegionServerTests.class, SmallTests.class})<a name="line.57"></a>
-<span class="sourceLineNo">058</span>public class TestWALMonotonicallyIncreasingSeqId {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  final Log LOG = LogFactory.getLog(getClass());<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir = TEST_UTIL.getDataTestDir("TestWALMonotonicallyIncreasingSeqId");<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private WALFactory wals;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private FileSystem fileSystem;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private Configuration walConf;<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static final String KEY_SEED = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private static final int KEY_SEED_LEN = KEY_SEED.length();<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private static final char[] KEY_SEED_CHARS = KEY_SEED.toCharArray();<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @Rule<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public TestName name = new TestName();<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private HTableDescriptor getTableDesc(TableName tableName, byte[]... families) {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    for (byte[] family : families) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      // Set default to be three versions.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      hcd.setMaxVersions(Integer.MAX_VALUE);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      htd.addFamily(hcd);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    return htd;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private Region initHRegion(HTableDescriptor htd, byte[] startKey, byte[] stopKey, int replicaId)<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      throws IOException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    conf.setBoolean("hbase.hregion.mvcc.preassign", false);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), startKey, stopKey, false, 0, replicaId);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    fileSystem =  tableDir.getFileSystem(conf);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    HRegionFileSystem fs = new HRegionFileSystem(conf, fileSystem, tableDir, info);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    final Configuration walConf = new Configuration(conf);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    FSUtils.setRootDir(walConf, tableDir);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    this.walConf = walConf;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    wals = new WALFactory(walConf, null, "log_" + replicaId);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    HRegion region = HRegion.createHRegion(info, TEST_UTIL.getDefaultRootDirPath(), conf, htd,<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        wals.getWAL(info.getEncodedNameAsBytes(), info.getTable().getNamespace()));<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return region;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  CountDownLatch latch = new CountDownLatch(1);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  public class PutThread extends Thread {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    HRegion region;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public PutThread(HRegion region) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      this.region = region;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public void run() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      try {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        for(int i = 0; i &lt; 100; i++) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>          byte[] row = Bytes.toBytes("putRow" + i);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>          Put put = new Put(row);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          put.addColumn("cf".getBytes(), Bytes.toBytes(0), Bytes.toBytes(""));<a name="line.118"></a>
-<span class="sourceLineNo">119</span>          //put.setDurability(Durability.ASYNC_WAL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          latch.await();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          region.batchMutate(new Mutation[]{put});<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          Thread.sleep(10);<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">021</span>import static org.junit.Assert.fail;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.ArrayList;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.concurrent.CountDownLatch;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.commons.logging.Log;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.commons.logging.LogFactory;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.Path;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<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.TableName;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Put;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.After;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.AfterClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.Before;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Rule;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.Test;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.experimental.categories.Category;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.rules.TestName;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.runner.RunWith;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.runners.Parameterized;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.runners.Parameterized.Parameter;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.runners.Parameterized.Parameters;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * Test for HBASE-17471.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete path. Other<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * write paths like increment/append still assign mvcc in ringbuffer's consumer thread. If put and<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * increment are used parallel. Then seqid in WAL may not increase monotonically Disorder in wals<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * will lead to data loss.<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * This case use two thread to put and increment at the same time in a single region. Then check the<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail<a name="line.74"></a>
+<span class="sourceLineNo">075</span> */<a name="line.75"></a>
+<span class="sourceLineNo">076</span>@RunWith(Parameterized.class)<a name="line.76"></a>
+<span class="sourceLineNo">077</span>@Category({ RegionServerTests.class, SmallTests.class })<a name="line.77"></a>
+<span class="sourceLineNo">078</span>public class TestWALMonotonicallyIncreasingSeqId {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final Log LOG = LogFactory.getLog(getClass());<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static Path testDir = TEST_UTIL.getDataTestDir("TestWALMonotonicallyIncreasingSeqId");<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private WALFactory wals;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private FileSystem fileSystem;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private Configuration walConf;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private HRegion region;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Parameter<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public String walProvider;<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Parameters(name = "{index}: wal={0}")<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static List&lt;Object[]&gt; data() {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return Arrays.asList(new Object[] { "asyncfs" }, new Object[] { "filesystem" });<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private TableDescriptor getTableDesc(TableName tableName, byte[]... families) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    Arrays.stream(families).map(<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      f -&gt; ColumnFamilyDescriptorBuilder.newBuilder(f).setMaxVersions(Integer.MAX_VALUE).build())<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        .forEachOrdered(builder::addColumnFamily);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return builder.build();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private HRegion initHRegion(TableDescriptor htd, byte[] startKey, byte[] stopKey, int replicaId)<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      throws IOException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    conf.set("hbase.wal.provider", walProvider);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    conf.setBoolean("hbase.hregion.mvcc.preassign", false);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    RegionInfo info = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(startKey)<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        .setEndKey(stopKey).setReplicaId(replicaId).setRegionId(0).build();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    fileSystem = tableDir.getFileSystem(conf);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    final Configuration walConf = new Configuration(conf);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    FSUtils.setRootDir(walConf, tableDir);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    this.walConf = walConf;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    wals = new WALFactory(walConf, null, "log_" + replicaId);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    HRegion region = HRegion.createHRegion(info, TEST_UTIL.getDefaultRootDirPath(), conf, htd,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      wals.getWAL(info.getEncodedNameAsBytes(), info.getTable().getNamespace()));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return region;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
 <span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>      } catch (Throwable t) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        LOG.warn("Error happend when Increment: ", t);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public class IncThread extends Thread {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    HRegion region;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public IncThread(HRegion region) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.region = region;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    public void run() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      try {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        for(int i = 0; i &lt; 100; i++) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          byte[] row = Bytes.toBytes("incrementRow" + i);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          Increment inc = new Increment(row);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          inc.addColumn("cf".getBytes(), Bytes.toBytes(0), 1);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          //inc.setDurability(Durability.ASYNC_WAL);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          region.increment(inc);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          latch.countDown();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          Thread.sleep(10);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } catch (Throwable t) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        LOG.warn("Error happend when Put: ", t);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
+<span class="sourceLineNo">126</span>  CountDownLatch latch = new CountDownLatch(1);<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public class PutThread extends Thread {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    HRegion region;<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    public PutThread(HRegion region) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.region = region;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    public void run() {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      try {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        for (int i = 0; i &lt; 100; i++) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          byte[] row = Bytes.toBytes("putRow" + i);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          Put put = new Put(row);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          put.addColumn("cf".getBytes(), Bytes.toBytes(0), Bytes.toBytes(""));<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          latch.await();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          region.batchMutate(new Mutation[] { put });<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          Thread.sleep(10);<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>      } catch (Throwable t) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        LOG.warn("Error happend when Increment: ", t);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public class IncThread extends Thread {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    HRegion region;<a name="line.154"></a>
 <span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Test<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public void TestWALMonotonicallyIncreasingSeqId() throws Exception {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    byte[][] families = new byte[][] {Bytes.toBytes("cf")};<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    byte[] qf = Bytes.toBytes("cq");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    HTableDescriptor htd = getTableDesc(TableName.valueOf(name.getMethodName()), families);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    HRegion region = (HRegion)initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    List&lt;Thread&gt; putThreads = new ArrayList&lt;&gt;();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    for(int i = 0; i &lt; 1; i++) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      putThreads.add(new PutThread(region));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    IncThread incThread = new IncThread(region);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    for(int i = 0; i &lt; 1; i++) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      putThreads.get(i).start();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    incThread.start();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    incThread.join();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    Path logPath = ((FSHLog) region.getWAL()).getCurrentFileName();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    region.getWAL().rollWriter();<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Thread.sleep(10);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Path hbaseDir = new Path(walConf.get(HConstants.HBASE_DIR));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    Path oldWalsDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    WAL.Reader reader = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      reader = wals.createReader(fileSystem, logPath);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    } catch (Throwable t) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      reader = wals.createReader(fileSystem, new Path(oldWalsDir, logPath.getName()));<a name="line.185"></a>
+<span class="sourceLineNo">156</span>    public IncThread(HRegion region) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      this.region = region;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    public void run() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      try {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        for (int i = 0; i &lt; 100; i++) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          byte[] row = Bytes.toBytes("incrementRow" + i);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          Increment inc = new Increment(row);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          inc.addColumn("cf".getBytes(), Bytes.toBytes(0), 1);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          // inc.setDurability(Durability.ASYNC_WAL);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          region.increment(inc);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>          latch.countDown();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          Thread.sleep(10);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>      } catch (Throwable t) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        LOG.warn("Error happend when Put: ", t);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Before<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void setUp() throws IOException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    byte[][] families = new byte[][] { Bytes.toBytes("cf") };<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    TableDescriptor htd = getTableDesc(<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      TableName.valueOf(name.getMethodName().replaceAll("[^0-9A-Za-z_]", "_")), families);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    region = initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0);<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>    WAL.Entry e;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      long currentMaxSeqid = 0;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      while ((e = reader.next()) != null) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        if (!WALEdit.isMetaEditFamily(e.getEdit().getCells().get(0))) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>          long currentSeqid = e.getKey().getSequenceId();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          if(currentSeqid &gt; currentMaxSeqid) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            currentMaxSeqid = currentSeqid;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          } else {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            Assert.fail("Current max Seqid is " + currentMaxSeqid<a name="line.197"></a>
-<span class="sourceLineNo">198</span>                + ", but the next seqid in wal is smaller:" + currentSeqid);<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>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } finally {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if(reader != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        reader.close();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if(region != null) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        region.close();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<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">187</span>  @After<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public void tearDown() throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (region != null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      region.close();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @AfterClass<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public static void tearDownAfterClass() throws IOException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    TEST_UTIL.cleanupTestDir();<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private WAL.Reader createReader(Path logPath, Path oldWalsDir) throws IOException {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      return wals.createReader(fileSystem, logPath);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    } catch (IOException e) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      return wals.createReader(fileSystem, new Path(oldWalsDir, logPath.getName()));<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  @Test<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public void testWALMonotonicallyIncreasingSeqId() throws Exception {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    List&lt;Thread&gt; putThreads = new ArrayList&lt;&gt;();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    for (int i = 0; i &lt; 1; i++) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      putThreads.add(new PutThread(region));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    IncThread incThread = new IncThread(region);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    for (int i = 0; i &lt; 1; i++) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      putThreads.get(i).start();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    incThread.start();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    incThread.join();<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    Path logPath = ((AbstractFSWAL&lt;?&gt;) region.getWAL()).getCurrentFileName();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    region.getWAL().rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    Thread.sleep(10);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    Path hbaseDir = new Path(walConf.get(HConstants.HBASE_DIR));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Path oldWalsDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    try (WAL.Reader reader = createReader(logPath, oldWalsDir)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      long currentMaxSeqid = 0;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      for (WAL.Entry e; (e = reader.next()) != null;) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (!WALEdit.isMetaEditFamily(e.getEdit().getCells().get(0))) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          long currentSeqid = e.getKey().getSequenceId();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          if (currentSeqid &gt; currentMaxSeqid) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>            currentMaxSeqid = currentSeqid;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          } else {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            fail("Current max Seqid is " + currentMaxSeqid +<a name="line.233"></a>
+<span class="sourceLineNo">234</span>              ", but the next seqid in wal is smaller:" + currentSeqid);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>}<a name="line.240"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.ScanThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.ScanThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.ScanThread.html
index 51d8a6a..fc531fc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.ScanThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.ScanThread.html
@@ -391,8 +391,8 @@
 <span class="sourceLineNo">383</span>          latch.await();<a name="line.383"></a>
 <span class="sourceLineNo">384</span>        } catch (InterruptedException e) {<a name="line.384"></a>
 <span class="sourceLineNo">385</span>        }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        while (!next) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          resScanner.next(results);<a name="line.387"></a>
+<span class="sourceLineNo">386</span>        while (next) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          next = resScanner.next(results);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>        }<a name="line.388"></a>
 <span class="sourceLineNo">389</span>      } finally {<a name="line.389"></a>
 <span class="sourceLineNo">390</span>        scanCompletedCounter.incrementAndGet();<a name="line.390"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.html
index 51d8a6a..fc531fc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/TestCompactedHFilesDischarger.html
@@ -391,8 +391,8 @@
 <span class="sourceLineNo">383</span>          latch.await();<a name="line.383"></a>
 <span class="sourceLineNo">384</span>        } catch (InterruptedException e) {<a name="line.384"></a>
 <span class="sourceLineNo">385</span>        }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        while (!next) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          resScanner.next(results);<a name="line.387"></a>
+<span class="sourceLineNo">386</span>        while (next) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          next = resScanner.next(results);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>        }<a name="line.388"></a>
 <span class="sourceLineNo">389</span>      } finally {<a name="line.389"></a>
 <span class="sourceLineNo">390</span>        scanCompletedCounter.incrementAndGet();<a name="line.390"></a>


[03/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/project-summary.html b/hbase-shaded-check-invariants/project-summary.html
index 6560bb7..2d40e8a 100644
--- a/hbase-shaded-check-invariants/project-summary.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/source-repository.html b/hbase-shaded-check-invariants/source-repository.html
index 120ad2a..b05d92f 100644
--- a/hbase-shaded-check-invariants/source-repository.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/team-list.html b/hbase-shaded-check-invariants/team-list.html
index c2b6424..8dc7bca 100644
--- a/hbase-shaded-check-invariants/team-list.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 330ce96..87640c2 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -438,7 +438,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 6550adc..c04f43c 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -296,7 +296,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index e633018..25e0499 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -293,7 +293,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 763e53e..5c33afa 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -496,7 +496,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 4752f5a..5ef7543 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -346,7 +346,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index bb55e20..a48d92a 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -464,7 +464,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 74f1f72..5041e08 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -419,7 +419,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index e803113..91e5803 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -441,7 +441,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 9f4ebb1..4151cc5 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -380,7 +380,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index ec17052..9083ba6 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <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.5-HBASE.min.css" />
@@ -774,7 +774,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 270bb37..e8595da 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -340,7 +340,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index a4abbf4..24c586d 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -310,7 +310,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index b2ca3ef..9683caa 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -336,7 +336,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index eb395b1..f188a86 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index e958b56..df4c915 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <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.5-HBASE.min.css" />
@@ -336,7 +336,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 4900d70..d4e9f0f 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -304,7 +304,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 91083eb..36d53c5 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -338,7 +338,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 26719f9..fb20eeb 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -525,7 +525,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 2ae6188..d9b7590 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -717,7 +717,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index 2710a58..fa4532b 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -10107,25 +10107,6 @@
 </tbody>
 </table>
 </li>
-<li class="blockList">
-<table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
-<caption><span>org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th scope="col">Constant Field</th>
-<th class="colLast" scope="col">Value</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestWALMonotonicallyIncreasingSeqId.KEY_SEED">
-<!--   -->
-</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="http://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/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED">KEY_SEED</a></code></td>
-<td class="colLast"><code>"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</code></td>
-</tr>
-</tbody>
-</table>
-</li>
 </ul>
 <ul class="blockList">
 <li class="blockList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 0d7677b..425328b 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -7018,6 +7018,8 @@
 <dd>
 <div class="block">Creates a random table with the given parameters</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#createReader-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">createReader(Path, Path)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.TimeBoundedMultiThreadedReader.html#createReaderThread-int-">createReaderThread(int)</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.TimeBoundedMultiThreadedReader.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestTimeBoundedRequestsWithRegionReplicas.TimeBoundedMultiThreadedReader</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/MultiThreadedReader.html#createReaderThread-int-">createReaderThread(int)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/MultiThreadedReader.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedReader</a></dt>
@@ -8032,6 +8034,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestSyncTimeRangeTracker.TrtUpdateRunnable.html#data">data</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestSyncTimeRangeTracker.TrtUpdateRunnable.html" title="class in org.apache.hadoop.hbase.regionserver">TestSyncTimeRangeTracker.TrtUpdateRunnable</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestDurability.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestDurability</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestMultiRowResource.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestMultiRowResource.html" title="class in org.apache.hadoop.hbase.rest">TestMultiRowResource</a></dt>
@@ -17150,7 +17154,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html#initHRegion-org.apache.hadoop.hbase.TableName-byte:A-byte:A-org.apache.hadoop.hbase.wal.WAL-">initHRegion(TableName, byte[], byte[], WAL)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#initHRegion-org.apache.hadoop.hbase.HTableDescriptor-byte:A-byte:A-int-">initHRegion(HTableDescriptor, byte[], byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#initHRegion-org.apache.hadoop.hbase.client.TableDescriptor-byte:A-byte:A-int-">initHRegion(TableDescriptor, byte[], byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.html#INITIAL_REGION_NUM">INITIAL_REGION_NUM</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionMergeTransactionOnCluster</a></dt>
 <dd>&nbsp;</dd>
@@ -18700,12 +18704,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApi.html#KEY_SECOND">KEY_SECOND</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApi.html" title="class in org.apache.hadoop.hbase.client">TestAsyncReplicationAdminApi</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED">KEY_SEED</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED_CHARS">KEY_SEED_CHARS</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED_LEN">KEY_SEED_LEN</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html#KEY_SIZE_OPTION">KEY_SIZE_OPTION</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">CreateRandomStoreFile</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/token/TestZKSecretWatcher.html#KEY_SLAVE">KEY_SLAVE</a></span> - Static variable in class org.apache.hadoop.hbase.security.token.<a href="org/apache/hadoop/hbase/security/token/TestZKSecretWatcher.html" title="class in org.apache.hadoop.hbase.security.token">TestZKSecretWatcher</a></dt>
@@ -28456,6 +28454,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId.PutThread</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALSplit.ZombieLastLogWriterRegionServer.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALSplit.ZombieLastLogWriterRegionServer.html" title="class in org.apache.hadoop.hbase.wal">TestWALSplit.ZombieLastLogWriterRegionServer</a></dt>
 <dd>
 <div class="block">Region to write edits for.</div>
@@ -32761,6 +32761,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.throttle.<a href="org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">TestFlushWithThroughputController</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestFSWAL</a></dt>
@@ -37487,6 +37489,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.throttle.<a href="org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">TestFlushWithThroughputController</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestLogRolling</a></dt>
@@ -37861,6 +37865,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestTags.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestFSWAL</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRollPeriod.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRollPeriod.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestLogRollPeriod</a></dt>
@@ -58273,13 +58279,11 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestWALMonotonicallyIncreasingSeqId</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></dt>
 <dd>
-<div class="block">Test for HBASE-17471
- MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete
- path.</div>
+<div class="block">Test for HBASE-17471.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#TestWALMonotonicallyIncreasingSeqId--">TestWALMonotonicallyIncreasingSeqId()</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#TestWALMonotonicallyIncreasingSeqId--">TestWALMonotonicallyIncreasingSeqId()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#testWALMonotonicallyIncreasingSeqId--">testWALMonotonicallyIncreasingSeqId()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestWALMonotonicallyIncreasingSeqId.IncThread</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></dt>
 <dd>&nbsp;</dd>
@@ -62482,6 +62486,8 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompactionInDeadRegionServer.html#walProvider">walProvider</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompactionInDeadRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompactionInDeadRegionServer</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#walProvider">walProvider</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestDurability.html#walProvider">walProvider</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestDurability</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestBoundedRegionGroupingStrategy.html#walProvider">walProvider</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestBoundedRegionGroupingStrategy.html" title="class in org.apache.hadoop.hbase.wal">TestBoundedRegionGroupingStrategy</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 c9a3768..bd845ae 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -143,8 +143,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 eb8f9e1..5d84c51 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -578,15 +578,15 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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/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>
 <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/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/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/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/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 46c9672..dec1fae 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="http://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.procedure.Procedure (implements java.util.concurrent.<a href="http://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="http://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.procedure2.Procedure&lt;TEnvironment&gt; (implements java.lang.<a href="http://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="http://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.ProcedureManager

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 f73ba8e..451a7e3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -205,9 +205,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
index a8f5b47..fc732cf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.133">TestWALMonotonicallyIncreasingSeqId.IncThread</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.153">TestWALMonotonicallyIncreasingSeqId.IncThread</a>
 extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -239,7 +239,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>region</h4>
-<pre>org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html#line.134">region</a></pre>
+<pre>org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html#line.154">region</a></pre>
 </li>
 </ul>
 </li>
@@ -256,7 +256,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IncThread</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html#line.135">IncThread</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html#line.156">IncThread</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region)</pre>
 </li>
 </ul>
 </li>
@@ -273,7 +273,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html#line.139">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html#line.161">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
index 02895d7..017528c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.106">TestWALMonotonicallyIncreasingSeqId.PutThread</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.128">TestWALMonotonicallyIncreasingSeqId.PutThread</a>
 extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -239,7 +239,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>region</h4>
-<pre>org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#line.107">region</a></pre>
+<pre>org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#line.129">region</a></pre>
 </li>
 </ul>
 </li>
@@ -256,7 +256,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PutThread</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#line.108">PutThread</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#line.131">PutThread</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region)</pre>
 </li>
 </ul>
 </li>
@@ -273,7 +273,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#line.113">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.PutThread.html#line.136">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>


[09/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on after<a name="line.704"></a>
-<span c

<TRUNCATED>

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

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


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

Branch: refs/heads/asf-site
Commit: 1473a64a75932fc0b88e354fa1251bb854186606
Parents: f2c790b
Author: jenkins <bu...@apache.org>
Authored: Tue Dec 12 15:18:04 2017 +0000
Committer: jenkins <bu...@apache.org>
Committed: Tue Dec 12 15:18:04 2017 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |    4 +-
 apache_hbase_reference_guide.pdf                |    6 +-
 book.html                                       |    2 +-
 bulk-loads.html                                 |    4 +-
 checkstyle-aggregate.html                       |   64 +-
 checkstyle.rss                                  |    6 +-
 coc.html                                        |    4 +-
 cygwin.html                                     |    4 +-
 dependencies.html                               |    4 +-
 dependency-convergence.html                     |    4 +-
 dependency-info.html                            |    4 +-
 dependency-management.html                      |    4 +-
 devapidocs/constant-values.html                 |    6 +-
 devapidocs/index-all.html                       |    6 +-
 ...BlockAsyncDFSOutputHelper.CancelOnClose.html |    8 +-
 ...ockAsyncDFSOutputHelper.ChecksumCreater.html |    6 +-
 ...kAsyncDFSOutputHelper.NameNodeException.html |    6 +-
 .../FanOutOneBlockAsyncDFSOutputHelper.html     |   68 +-
 ...ockAsyncDFSOutputHelper.ChecksumCreater.html |    6 +-
 .../org/apache/hadoop/hbase/Version.html        |    6 +-
 ...OneBlockAsyncDFSOutputHelper.BlockAdder.html | 1284 +++++++++---------
 ...BlockAsyncDFSOutputHelper.CancelOnClose.html | 1284 +++++++++---------
 ...ockAsyncDFSOutputHelper.ChecksumCreater.html | 1284 +++++++++---------
 ...ckAsyncDFSOutputHelper.DFSClientAdaptor.html | 1284 +++++++++---------
 ...neBlockAsyncDFSOutputHelper.FileCreator.html | 1284 +++++++++---------
 ...eBlockAsyncDFSOutputHelper.LeaseManager.html | 1284 +++++++++---------
 ...kAsyncDFSOutputHelper.NameNodeException.html | 1284 +++++++++---------
 ...utOneBlockAsyncDFSOutputHelper.PBHelper.html | 1284 +++++++++---------
 ...DFSOutputHelper.PipelineAckStatusGetter.html | 1284 +++++++++---------
 ...kAsyncDFSOutputHelper.StorageTypeSetter.html | 1284 +++++++++---------
 .../FanOutOneBlockAsyncDFSOutputHelper.html     | 1284 +++++++++---------
 export_control.html                             |    4 +-
 hbase-annotations/checkstyle.html               |    4 +-
 hbase-annotations/dependencies.html             |    4 +-
 hbase-annotations/dependency-convergence.html   |    4 +-
 hbase-annotations/dependency-info.html          |    4 +-
 hbase-annotations/dependency-management.html    |    4 +-
 hbase-annotations/index.html                    |    4 +-
 hbase-annotations/integration.html              |    4 +-
 hbase-annotations/issue-tracking.html           |    4 +-
 hbase-annotations/license.html                  |    4 +-
 hbase-annotations/mail-lists.html               |    4 +-
 hbase-annotations/plugin-management.html        |    4 +-
 hbase-annotations/plugins.html                  |    4 +-
 hbase-annotations/project-info.html             |    4 +-
 hbase-annotations/project-reports.html          |    4 +-
 hbase-annotations/project-summary.html          |    4 +-
 hbase-annotations/source-repository.html        |    4 +-
 hbase-annotations/team-list.html                |    4 +-
 hbase-build-configuration/dependencies.html     |    4 +-
 .../dependency-convergence.html                 |    4 +-
 hbase-build-configuration/dependency-info.html  |    4 +-
 .../dependency-management.html                  |    4 +-
 .../hbase-archetypes/dependencies.html          |    4 +-
 .../dependency-convergence.html                 |    4 +-
 .../hbase-archetypes/dependency-info.html       |    4 +-
 .../hbase-archetypes/dependency-management.html |    4 +-
 .../hbase-archetype-builder/dependencies.html   |    4 +-
 .../dependency-convergence.html                 |    4 +-
 .../dependency-info.html                        |    4 +-
 .../dependency-management.html                  |    4 +-
 .../hbase-archetype-builder/index.html          |    4 +-
 .../hbase-archetype-builder/integration.html    |    4 +-
 .../hbase-archetype-builder/issue-tracking.html |    4 +-
 .../hbase-archetype-builder/license.html        |    4 +-
 .../hbase-archetype-builder/mail-lists.html     |    4 +-
 .../plugin-management.html                      |    4 +-
 .../hbase-archetype-builder/plugins.html        |    4 +-
 .../hbase-archetype-builder/project-info.html   |    4 +-
 .../project-summary.html                        |    4 +-
 .../source-repository.html                      |    4 +-
 .../hbase-archetype-builder/team-list.html      |    4 +-
 .../hbase-client-project/checkstyle.html        |    4 +-
 .../hbase-client-project/dependencies.html      |    4 +-
 .../dependency-convergence.html                 |    4 +-
 .../hbase-client-project/dependency-info.html   |    4 +-
 .../dependency-management.html                  |    4 +-
 .../hbase-client-project/index.html             |    4 +-
 .../hbase-client-project/integration.html       |    4 +-
 .../hbase-client-project/issue-tracking.html    |    4 +-
 .../hbase-client-project/license.html           |    4 +-
 .../hbase-client-project/mail-lists.html        |    4 +-
 .../hbase-client-project/plugin-management.html |    4 +-
 .../hbase-client-project/plugins.html           |    4 +-
 .../hbase-client-project/project-info.html      |    4 +-
 .../hbase-client-project/project-reports.html   |    4 +-
 .../hbase-client-project/project-summary.html   |    4 +-
 .../hbase-client-project/source-repository.html |    4 +-
 .../hbase-client-project/team-list.html         |    4 +-
 .../hbase-shaded-client-project/checkstyle.html |    4 +-
 .../dependencies.html                           |    4 +-
 .../dependency-convergence.html                 |    4 +-
 .../dependency-info.html                        |    4 +-
 .../dependency-management.html                  |    4 +-
 .../hbase-shaded-client-project/index.html      |    4 +-
 .../integration.html                            |    4 +-
 .../issue-tracking.html                         |    4 +-
 .../hbase-shaded-client-project/license.html    |    4 +-
 .../hbase-shaded-client-project/mail-lists.html |    4 +-
 .../plugin-management.html                      |    4 +-
 .../hbase-shaded-client-project/plugins.html    |    4 +-
 .../project-info.html                           |    4 +-
 .../project-reports.html                        |    4 +-
 .../project-summary.html                        |    4 +-
 .../source-repository.html                      |    4 +-
 .../hbase-shaded-client-project/team-list.html  |    4 +-
 .../hbase-archetypes/index.html                 |    4 +-
 .../hbase-archetypes/integration.html           |    4 +-
 .../hbase-archetypes/issue-tracking.html        |    4 +-
 .../hbase-archetypes/license.html               |    4 +-
 .../hbase-archetypes/mail-lists.html            |    4 +-
 .../hbase-archetypes/plugin-management.html     |    4 +-
 .../hbase-archetypes/plugins.html               |    4 +-
 .../hbase-archetypes/project-info.html          |    4 +-
 .../hbase-archetypes/project-summary.html       |    4 +-
 .../hbase-archetypes/source-repository.html     |    4 +-
 .../hbase-archetypes/team-list.html             |    4 +-
 .../hbase-spark/checkstyle.html                 |    4 +-
 .../hbase-spark/dependencies.html               |    4 +-
 .../hbase-spark/dependency-convergence.html     |    4 +-
 .../hbase-spark/dependency-info.html            |    4 +-
 .../hbase-spark/dependency-management.html      |    4 +-
 .../hbase-spark/index.html                      |    4 +-
 .../hbase-spark/integration.html                |    4 +-
 .../hbase-spark/issue-tracking.html             |    4 +-
 .../hbase-spark/license.html                    |    4 +-
 .../hbase-spark/mail-lists.html                 |    4 +-
 .../hbase-spark/plugin-management.html          |    4 +-
 .../hbase-spark/plugins.html                    |    4 +-
 .../hbase-spark/project-info.html               |    4 +-
 .../hbase-spark/project-reports.html            |    4 +-
 .../hbase-spark/project-summary.html            |    4 +-
 .../hbase-spark/source-repository.html          |    4 +-
 .../hbase-spark/team-list.html                  |    4 +-
 hbase-build-configuration/index.html            |    4 +-
 hbase-build-configuration/integration.html      |    4 +-
 hbase-build-configuration/issue-tracking.html   |    4 +-
 hbase-build-configuration/license.html          |    4 +-
 hbase-build-configuration/mail-lists.html       |    4 +-
 .../plugin-management.html                      |    4 +-
 hbase-build-configuration/plugins.html          |    4 +-
 hbase-build-configuration/project-info.html     |    4 +-
 hbase-build-configuration/project-summary.html  |    4 +-
 .../source-repository.html                      |    4 +-
 hbase-build-configuration/team-list.html        |    4 +-
 hbase-shaded-check-invariants/checkstyle.html   |    4 +-
 hbase-shaded-check-invariants/dependencies.html |    4 +-
 .../dependency-convergence.html                 |    4 +-
 .../dependency-info.html                        |    4 +-
 .../dependency-management.html                  |    4 +-
 hbase-shaded-check-invariants/index.html        |    4 +-
 hbase-shaded-check-invariants/integration.html  |    4 +-
 .../issue-tracking.html                         |    4 +-
 hbase-shaded-check-invariants/license.html      |    4 +-
 hbase-shaded-check-invariants/mail-lists.html   |    4 +-
 .../plugin-management.html                      |    4 +-
 hbase-shaded-check-invariants/plugins.html      |    4 +-
 hbase-shaded-check-invariants/project-info.html |    4 +-
 .../project-reports.html                        |    4 +-
 .../project-summary.html                        |    4 +-
 .../source-repository.html                      |    4 +-
 hbase-shaded-check-invariants/team-list.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/constant-values.html             |   19 -
 testdevapidocs/index-all.html                   |   28 +-
 .../hadoop/hbase/backup/package-tree.html       |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   10 +-
 .../hadoop/hbase/procedure/package-tree.html    |    8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |    2 +-
 ...LMonotonicallyIncreasingSeqId.IncThread.html |    8 +-
 ...LMonotonicallyIncreasingSeqId.PutThread.html |    8 +-
 .../TestWALMonotonicallyIncreasingSeqId.html    |  214 ++-
 .../hbase/regionserver/package-summary.html     |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html |    4 +-
 .../apache/hadoop/hbase/test/package-tree.html  |    4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    2 +-
 ...LMonotonicallyIncreasingSeqId.IncThread.html |  407 +++---
 ...LMonotonicallyIncreasingSeqId.PutThread.html |  407 +++---
 .../TestWALMonotonicallyIncreasingSeqId.html    |  407 +++---
 ...estCompactedHFilesDischarger.ScanThread.html |    4 +-
 .../TestCompactedHFilesDischarger.html          |    4 +-
 200 files changed, 8322 insertions(+), 8170 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 1f5706b..cc13da7 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -606,7 +606,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 65c06f5..5448a27 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:20171211144802+00'00')
-/CreationDate (D:20171211144802+00'00')
+/ModDate (D:20171212144808+00'00')
+/CreationDate (D:20171212144808+00'00')
 >>
 endobj
 2 0 obj
@@ -27974,7 +27974,7 @@ endobj
 endobj
 136 0 obj
 << /Limits [(__anchor-top) (adding.new.node)]
-/Names [(__anchor-top) 25 0 R (__indexterm-7345738) 3431 0 R (__indexterm-7347988) 3433 0 R (__indexterm-7350050) 3434 0 R (__indexterm-7351924) 3435 0 R (acid) 908 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3530 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3531 0 R (add.metrics) 3528 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3772 0 R (adding.new.node) 3011 0 R]
+/Names [(__anchor-top) 25 0 R (__indexterm-7345740) 3431 0 R (__indexterm-7347990) 3433 0 R (__indexterm-7350052) 3434 0 R (__indexterm-7351926) 3435 0 R (acid) 908 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3530 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3531 0 R (add.metrics) 3528 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3772 0 R (adding.new.node) 3011 0 R]
 >>
 endobj
 137 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 6f0a752..490ca06 100644
--- a/book.html
+++ b/book.html
@@ -37002,7 +37002,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2017-12-11 14:29:44 UTC
+Last updated 2017-12-12 14:29:37 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 98d13ad..519614b 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -311,7 +311,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index e98f038..198c0e8 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -289,7 +289,7 @@
 <td>3453</td>
 <td>0</td>
 <td>0</td>
-<td>20625</td></tr></table></div>
+<td>20619</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -4042,7 +4042,7 @@
 <td><a href="#org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>3</td></tr>
+<td>1</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputSaslHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java</a></td>
 <td>0</td>
@@ -8962,7 +8962,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestWALMonotonicallyIncreasingSeqId.java">org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>5</td></tr>
+<td>1</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestWalAndCompactingMemStoreFlush.java">org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.java</a></td>
 <td>0</td>
@@ -12829,7 +12829,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_coding.html#InnerAssignment">InnerAssignment</a></td>
-<td>103</td>
+<td>104</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -12867,7 +12867,7 @@
 <tr class="b">
 <td>imports</td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_imports.html#AvoidStarImport">AvoidStarImport</a></td>
-<td>128</td>
+<td>126</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
@@ -12877,7 +12877,7 @@
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>groups: <tt>&quot;*,org.apache.hadoop.hbase.shaded&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>2479</td>
+<td>2477</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -12930,7 +12930,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>1918</td>
+<td>1915</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -58175,22 +58175,10 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>495</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 114).</td>
-<td>508</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>602</td></tr></table></div>
+<td>606</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputSaslHelper.java">org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java</h3>
 <table border="0" class="table table-striped">
@@ -112037,34 +112025,10 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.apache.hadoop.hbase.*.</td>
-<td>26</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.apache.hadoop.hbase.client.*.</td>
-<td>27</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.testclassification.RegionServerTests' import.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>42</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>164</td></tr></table></div>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>227</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestWalAndCompactingMemStoreFlush.java">org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.java</h3>
 <table border="0" class="table table-striped">
@@ -159198,7 +159162,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 03ef5b9..87fef83 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2017 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3453,
-             Errors: 20625,
+             Errors: 20619,
              Warnings: 0,
              Infos: 0
       </title>
@@ -20229,7 +20229,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  5
+                  1
                 </td>
               </tr>
                           <tr>
@@ -44421,7 +44421,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  3
+                  1
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index d422d22..41735fa 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -380,7 +380,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index 456acf1..f1bad1d 100644
--- a/cygwin.html
+++ b/cygwin.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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -679,7 +679,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index e8e25a9..074ae73 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -445,7 +445,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 12b84b2..2bdb36a 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -999,7 +999,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 8d1b39a..4a18fc5 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -318,7 +318,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 0dd7ab5..cfa31ba 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -980,7 +980,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 7c0f392..f87f99d 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3705,21 +3705,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="http://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>"Mon Dec 11 14:42:23 UTC 2017"</code></td>
+<td class="colLast"><code>"Tue Dec 12 14:42:35 UTC 2017"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"08d6b557501b7e36ebf407f9e734c1c22978f2c4"</code></td>
+<td class="colLast"><code>"2e813f106f2647f8704378efbf3531051c5aea78"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="http://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>"a75cdfb079365f60df00d4b88ae1712c"</code></td>
+<td class="colLast"><code>"5e16f126f518d8df265d748b4f2d28a5"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 3d48df2..c9a0991 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -18546,15 +18546,15 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/Import.html#createCfRenameMap-org.apache.hadoop.conf.Configuration-">createCfRenameMap(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/Import.html" title="class in org.apache.hadoop.hbase.mapreduce">Import</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html#createChecksum-java.lang.Object-">createChecksum(Object)</a></span> - Method in interface org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html#createChecksum-org.apache.hadoop.hdfs.DFSClient-">createChecksum(DFSClient)</a></span> - Method in interface org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksum-org.apache.hadoop.hdfs.DFSClient-">createChecksum(DFSClient)</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater--">createChecksumCreater()</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater27-java.lang.Class-">createChecksumCreater27(Class&lt;?&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater27-java.lang.reflect.Method-java.lang.Class-">createChecksumCreater27(Method, Class&lt;?&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater28-java.lang.Class-">createChecksumCreater28(Class&lt;?&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater28-java.lang.reflect.Method-java.lang.Class-">createChecksumCreater28(Method, Class&lt;?&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/ChunkCreator.html#createChunk-boolean-org.apache.hadoop.hbase.regionserver.CompactingMemStore.IndexType-int-">createChunk(boolean, CompactingMemStore.IndexType, int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/ChunkCreator.html" title="class in org.apache.hadoop.hbase.regionserver">ChunkCreator</a></dt>
 <dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
index 71064d0..7e1a533 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.527">FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose</a>
+<pre>static final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.531">FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose</a>
 extends <a href="http://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/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a></pre>
 </li>
@@ -208,7 +208,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/util/CancelablePro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>client</h4>
-<pre>private final&nbsp;org.apache.hadoop.hdfs.DFSClient <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html#line.529">client</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hdfs.DFSClient <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html#line.533">client</a></pre>
 </li>
 </ul>
 </li>
@@ -225,7 +225,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/util/CancelablePro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CancelOnClose</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html#line.531">CancelOnClose</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html#line.535">CancelOnClose</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client)</pre>
 </li>
 </ul>
 </li>
@@ -242,7 +242,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/util/CancelablePro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>progress</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html#line.536">progress</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html#line.540">progress</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html#progress--">CancelableProgressable</a></code></span></div>
 <div class="block">Report progress.  Returns true if operations should continue, false if the
  operation should be canceled and rolled back.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
index 8811ade..61dc791 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
@@ -126,7 +126,7 @@ var activeTableTab = "activeTableTab";
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.util.DataChecksum</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html#createChecksum-java.lang.Object-">createChecksum</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;conf)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html#createChecksum-org.apache.hadoop.hdfs.DFSClient-">createChecksum</a></span>(org.apache.hadoop.hdfs.DFSClient&nbsp;client)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -143,13 +143,13 @@ var activeTableTab = "activeTableTab";
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="createChecksum-java.lang.Object-">
+<a name="createChecksum-org.apache.hadoop.hdfs.DFSClient-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createChecksum</h4>
-<pre>org.apache.hadoop.util.DataChecksum&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html#line.195">createChecksum</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;conf)</pre>
+<pre>org.apache.hadoop.util.DataChecksum&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html#line.195">createChecksum</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
index cdf40da..0a4b102 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
@@ -126,7 +126,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.727">FanOutOneBlockAsyncDFSOutputHelper.NameNodeException</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.731">FanOutOneBlockAsyncDFSOutputHelper.NameNodeException</a>
 extends <a href="http://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">Exception other than RemoteException thrown when calling create on namenode</div>
 <dl>
@@ -215,7 +215,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html#line.729">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html#line.733">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.serialVersionUID">Constant Field Values</a></dd>
@@ -236,7 +236,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NameNodeException</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html#line.731">NameNodeException</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;cause)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html#line.735">NameNodeException</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;cause)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
index 2b126d3..b54ff96 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
@@ -319,11 +319,13 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </tr>
 <tr id="i6" class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater27-java.lang.Class-">createChecksumCreater27</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater27-java.lang.reflect.Method-java.lang.Class-">createChecksumCreater27</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&nbsp;getConfMethod,
+                       <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
 </tr>
 <tr id="i7" class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater28-java.lang.Class-">createChecksumCreater28</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater28-java.lang.reflect.Method-java.lang.Class-">createChecksumCreater28</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&nbsp;getConfMethod,
+                       <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
 </tr>
 <tr id="i8" class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor</a></code></td>
@@ -592,7 +594,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FILE_CREATOR</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.224">FILE_CREATOR</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.223">FILE_CREATOR</a></pre>
 </li>
 </ul>
 </li>
@@ -626,7 +628,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createDFSClientAdaptor</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.226">createDFSClientAdaptor</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.225">createDFSClientAdaptor</a>()
                                                                                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -640,7 +642,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createLeaseManager</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.LeaseManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.242">createLeaseManager</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.LeaseManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.241">createLeaseManager</a>()
                                                                            throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -654,7 +656,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createPipelineAckStatusGetter27</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.270">createPipelineAckStatusGetter27</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.269">createPipelineAckStatusGetter27</a>()
                                                                                                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -668,7 +670,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createPipelineAckStatusGetter26</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.314">createPipelineAckStatusGetter26</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.313">createPipelineAckStatusGetter26</a>()
                                                                                                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -682,7 +684,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createPipelineAckStatusGetter</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.330">createPipelineAckStatusGetter</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.329">createPipelineAckStatusGetter</a>()
                                                                                                  throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -696,7 +698,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createStorageTypeSetter</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.340">createStorageTypeSetter</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.341">createStorageTypeSetter</a>()
                                                                                      throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -710,7 +712,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createBlockAdder</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.BlockAdder</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.363">createBlockAdder</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.BlockAdder</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.364">createBlockAdder</a>()
                                                                        throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -724,7 +726,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createPBHelper</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PBHelper</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.410">createPBHelper</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PBHelper.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.PBHelper</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.411">createPBHelper</a>()
                                                                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -732,13 +734,14 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </dl>
 </li>
 </ul>
-<a name="createChecksumCreater28-java.lang.Class-">
+<a name="createChecksumCreater28-java.lang.reflect.Method-java.lang.Class-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createChecksumCreater28</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.444">createChecksumCreater28</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.445">createChecksumCreater28</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&nbsp;getConfMethod,
+                                                                                          <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)
                                                                                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -746,13 +749,14 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </dl>
 </li>
 </ul>
-<a name="createChecksumCreater27-java.lang.Class-">
+<a name="createChecksumCreater27-java.lang.reflect.Method-java.lang.Class-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createChecksumCreater27</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.465">createChecksumCreater27</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.467">createChecksumCreater27</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&nbsp;getConfMethod,
+                                                                                          <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)
                                                                                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -766,7 +770,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createChecksumCreater</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.482">createChecksumCreater</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.484">createChecksumCreater</a>()
                                                                                  throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a>,
                                                                                         <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/ClassNotFoundException.html?is-external=true" title="class or interface in java.lang">ClassNotFoundException</a></pre>
 <dl>
@@ -782,7 +786,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createFileCreator3</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.493">createFileCreator3</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.497">createFileCreator3</a>()
                                                                           throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -796,7 +800,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createFileCreator2</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.506">createFileCreator2</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.509">createFileCreator2</a>()
                                                                           throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -810,7 +814,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createFileCreator</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.517">createFileCreator</a>()
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.FileCreator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.521">createFileCreator</a>()
                                                                          throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodException.html?is-external=true" title="class or interface in java.lang">NoSuchMethodException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -824,7 +828,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>beginFileLease</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.560">beginFileLease</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.564">beginFileLease</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client,
                            long&nbsp;inodeId)</pre>
 </li>
 </ul>
@@ -834,7 +838,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>endFileLease</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.564">endFileLease</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.568">endFileLease</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client,
                          long&nbsp;inodeId)</pre>
 </li>
 </ul>
@@ -844,7 +848,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createChecksum</h4>
-<pre>static&nbsp;org.apache.hadoop.util.DataChecksum&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.568">createChecksum</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client)</pre>
+<pre>static&nbsp;org.apache.hadoop.util.DataChecksum&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.572">createChecksum</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client)</pre>
 </li>
 </ul>
 <a name="getStatus-org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.PipelineAckProto-">
@@ -853,7 +857,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getStatus</h4>
-<pre>static&nbsp;org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.Status&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.572">getStatus</a>(org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.PipelineAckProto&nbsp;ack)</pre>
+<pre>static&nbsp;org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.Status&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.576">getStatus</a>(org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.PipelineAckProto&nbsp;ack)</pre>
 </li>
 </ul>
 <a name="processWriteBlockResponse-org.apache.hadoop.hbase.shaded.io.netty.channel.Channel-org.apache.hadoop.hdfs.protocol.DatanodeInfo-org.apache.hadoop.hbase.shaded.io.netty.util.concurrent.Promise-int-">
@@ -862,7 +866,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>processWriteBlockResponse</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.576">processWriteBlockResponse</a>(org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&nbsp;channel,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.580">processWriteBlockResponse</a>(org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&nbsp;channel,
                                               org.apache.hadoop.hdfs.protocol.DatanodeInfo&nbsp;dnInfo,
                                               org.apache.hadoop.hbase.shaded.io.netty.util.concurrent.Promise&lt;org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&gt;&nbsp;promise,
                                               int&nbsp;timeoutMs)</pre>
@@ -874,7 +878,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>requestWriteBlock</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.637">requestWriteBlock</a>(org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&nbsp;channel,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.641">requestWriteBlock</a>(org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&nbsp;channel,
                                       <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;?&gt;&nbsp;storageType,
                                       org.apache.hadoop.hdfs.protocol.proto.DataTransferProtos.OpWriteBlockProto.Builder&nbsp;writeBlockProtoBuilder)
                                throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -890,7 +894,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.649">initialize</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.653">initialize</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&nbsp;channel,
                                org.apache.hadoop.hdfs.protocol.DatanodeInfo&nbsp;dnInfo,
                                <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;?&gt;&nbsp;storageType,
@@ -912,7 +916,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>connectToDataNodes</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.io.netty.util.concurrent.Future&lt;org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.670">connectToDataNodes</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.io.netty.util.concurrent.Future&lt;org.apache.hadoop.hbase.shaded.io.netty.channel.Channel&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.674">connectToDataNodes</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                                                                                                                 org.apache.hadoop.hdfs.DFSClient&nbsp;client,
                                                                                                                                                                 <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clientName,
                                                                                                                                                                 org.apache.hadoop.hdfs.protocol.LocatedBlock&nbsp;locatedBlock,
@@ -930,7 +934,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createOutput</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.736">createOutput</a>(org.apache.hadoop.hdfs.DistributedFileSystem&nbsp;dfs,
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.740">createOutput</a>(org.apache.hadoop.hdfs.DistributedFileSystem&nbsp;dfs,
                                                          <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;src,
                                                          boolean&nbsp;overwrite,
                                                          boolean&nbsp;createParent,
@@ -951,7 +955,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createOutput</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.804">createOutput</a>(org.apache.hadoop.hdfs.DistributedFileSystem&nbsp;dfs,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutput</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.808">createOutput</a>(org.apache.hadoop.hdfs.DistributedFileSystem&nbsp;dfs,
                                                         org.apache.hadoop.fs.Path&nbsp;f,
                                                         boolean&nbsp;overwrite,
                                                         boolean&nbsp;createParent,
@@ -974,7 +978,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldRetryCreate</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.823">shouldRetryCreate</a>(org.apache.hadoop.ipc.RemoteException&nbsp;e)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.827">shouldRetryCreate</a>(org.apache.hadoop.ipc.RemoteException&nbsp;e)</pre>
 </li>
 </ul>
 <a name="completeFile-org.apache.hadoop.hdfs.DFSClient-org.apache.hadoop.hdfs.protocol.ClientProtocol-java.lang.String-java.lang.String-org.apache.hadoop.hdfs.protocol.ExtendedBlock-long-">
@@ -983,7 +987,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>completeFile</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.830">completeFile</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.834">completeFile</a>(org.apache.hadoop.hdfs.DFSClient&nbsp;client,
                          org.apache.hadoop.hdfs.protocol.ClientProtocol&nbsp;namenode,
                          <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;src,
                          <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clientName,
@@ -997,7 +1001,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sleepIgnoreInterrupt</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.855">sleepIgnoreInterrupt</a>(int&nbsp;retry)</pre>
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#line.859">sleepIgnoreInterrupt</a>(int&nbsp;retry)</pre>
 </li>
 </ul>
 </li>


[14/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on af

<TRUNCATED>

[08/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.PipelineAckStatusGetter.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address 

<TRUNCATED>

[13/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.DFSClientAdaptor.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move 

<TRUNCATED>

[07/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.StorageTypeSetter.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only 

<TRUNCATED>

[16/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.BlockAdder.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on after<a name="line.704"></a

<TRUNCATED>

[17/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/class-use/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/class-use/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/class-use/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
index e3f6c36..9e71923 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/asyncfs/class-use/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/asyncfs/class-use/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html
@@ -121,11 +121,13 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a></code></td>
-<td class="colLast"><span class="typeNameLabel">FanOutOneBlockAsyncDFSOutputHelper.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater27-java.lang.Class-">createChecksumCreater27</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">FanOutOneBlockAsyncDFSOutputHelper.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater27-java.lang.reflect.Method-java.lang.Class-">createChecksumCreater27</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&nbsp;getConfMethod,
+                       <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater.html" title="interface in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputHelper.ChecksumCreater</a></code></td>
-<td class="colLast"><span class="typeNameLabel">FanOutOneBlockAsyncDFSOutputHelper.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater28-java.lang.Class-">createChecksumCreater28</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">FanOutOneBlockAsyncDFSOutputHelper.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html#createChecksumCreater28-java.lang.reflect.Method-java.lang.Class-">createChecksumCreater28</a></span>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>&nbsp;getConfMethod,
+                       <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;confClass)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 bafe25c..65a682f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "08d6b557501b7e36ebf407f9e734c1c22978f2c4";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "2e813f106f2647f8704378efbf3531051c5aea78";<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 = "Mon Dec 11 14:42:23 UTC 2017";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Tue Dec 12 14:42:35 UTC 2017";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://asf920.gq1.ygridcore.net/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "a75cdfb079365f60df00d4b88ae1712c";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "5e16f126f518d8df265d748b4f2d28a5";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[05/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 205ee82..d7844e3 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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -336,7 +336,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: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/checkstyle.html b/hbase-annotations/checkstyle.html
index 2b35f17..fc0bc49 100644
--- a/hbase-annotations/checkstyle.html
+++ b/hbase-annotations/checkstyle.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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -150,7 +150,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependencies.html b/hbase-annotations/dependencies.html
index c8a11df..ff59424 100644
--- a/hbase-annotations/dependencies.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -272,7 +272,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-convergence.html b/hbase-annotations/dependency-convergence.html
index 6b7325d..f614ae4 100644
--- a/hbase-annotations/dependency-convergence.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-info.html b/hbase-annotations/dependency-info.html
index bd24b11..0057cbe 100644
--- a/hbase-annotations/dependency-info.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-management.html b/hbase-annotations/dependency-management.html
index 5bcf96c..fceb6fb 100644
--- a/hbase-annotations/dependency-management.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/index.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/index.html b/hbase-annotations/index.html
index bc6b8e2..58521a7 100644
--- a/hbase-annotations/index.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/integration.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/integration.html b/hbase-annotations/integration.html
index e0c3897..fd69698 100644
--- a/hbase-annotations/integration.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/issue-tracking.html b/hbase-annotations/issue-tracking.html
index 99b2461..9483aa6 100644
--- a/hbase-annotations/issue-tracking.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/license.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/license.html b/hbase-annotations/license.html
index 0066b39..b7fd7a1 100644
--- a/hbase-annotations/license.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/mail-lists.html b/hbase-annotations/mail-lists.html
index dc87bf3..39ff23a 100644
--- a/hbase-annotations/mail-lists.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugin-management.html b/hbase-annotations/plugin-management.html
index dcc7c83..b65e964 100644
--- a/hbase-annotations/plugin-management.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugins.html b/hbase-annotations/plugins.html
index da4257b..586978f 100644
--- a/hbase-annotations/plugins.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -222,7 +222,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-info.html b/hbase-annotations/project-info.html
index 4af19c5..8840c43 100644
--- a/hbase-annotations/project-info.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-reports.html b/hbase-annotations/project-reports.html
index 84b2899..67f0106 100644
--- a/hbase-annotations/project-reports.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-summary.html b/hbase-annotations/project-summary.html
index 9e1b34b..1b9a8a7 100644
--- a/hbase-annotations/project-summary.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/source-repository.html b/hbase-annotations/source-repository.html
index 391a422..f998853 100644
--- a/hbase-annotations/source-repository.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-annotations/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/team-list.html b/hbase-annotations/team-list.html
index 299303f..cced848 100644
--- a/hbase-annotations/team-list.html
+++ b/hbase-annotations/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Annotations &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/dependencies.html b/hbase-build-configuration/dependencies.html
index f95155b..b33ea99 100644
--- a/hbase-build-configuration/dependencies.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -330,7 +330,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/dependency-convergence.html b/hbase-build-configuration/dependency-convergence.html
index 010eee6..cff61a3 100644
--- a/hbase-build-configuration/dependency-convergence.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/dependency-info.html b/hbase-build-configuration/dependency-info.html
index d398d58..70f8dc3 100644
--- a/hbase-build-configuration/dependency-info.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -148,7 +148,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/dependency-management.html b/hbase-build-configuration/dependency-management.html
index 53095a9..cc9be20 100644
--- a/hbase-build-configuration/dependency-management.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/dependencies.html b/hbase-build-configuration/hbase-archetypes/dependencies.html
index dc416d8..ee8b01e 100644
--- a/hbase-build-configuration/hbase-archetypes/dependencies.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -330,7 +330,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/dependency-convergence.html b/hbase-build-configuration/hbase-archetypes/dependency-convergence.html
index e4bb645..69554c5 100644
--- a/hbase-build-configuration/hbase-archetypes/dependency-convergence.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/dependency-info.html b/hbase-build-configuration/hbase-archetypes/dependency-info.html
index 265e6b4..f145385 100644
--- a/hbase-build-configuration/hbase-archetypes/dependency-info.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -148,7 +148,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/dependency-management.html b/hbase-build-configuration/hbase-archetypes/dependency-management.html
index be6cd3e..7ca353f 100644
--- a/hbase-build-configuration/hbase-archetypes/dependency-management.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependencies.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependencies.html
index 6e83fd3..49cb8c8 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependencies.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -330,7 +330,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
index e9bae8f..21c7e89 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-info.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-info.html
index 269be44..36897e4 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-info.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -148,7 +148,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-management.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-management.html
index 02cbabd..8d3bac9 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/dependency-management.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/index.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/index.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/index.html
index 814d252..24d3104 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/index.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/integration.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/integration.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/integration.html
index e21dd01..de2aa88 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/integration.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/issue-tracking.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
index 571c8d8..2a5a644 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/license.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/license.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/license.html
index 72ec2ce..6bdccbf 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/license.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/mail-lists.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/mail-lists.html
index 881ac98..e84dfab 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/mail-lists.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugin-management.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugin-management.html
index 6cb9dfd..2c93278 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugin-management.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugins.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugins.html
index 484bc35..deef39d 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/plugins.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -218,7 +218,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-info.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-info.html
index b5c9dff..64ff8df 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-info.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-summary.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-summary.html
index 598ad1a..c7c3305 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/project-summary.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -163,7 +163,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/source-repository.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/source-repository.html
index 80719f4..8b644b8 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/source-repository.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/team-list.html b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/team-list.html
index 383a29d..963ade7 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/team-list.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-archetype-builder/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetype builder &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/checkstyle.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/checkstyle.html
index 4827f74..6fcc086 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/checkstyle.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/checkstyle.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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -244,7 +244,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependencies.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependencies.html
index f04711c..361fb76 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependencies.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -4169,7 +4169,7 @@ The following provides more details on the included cryptographic software:
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-convergence.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-convergence.html
index 13030fd..3497426 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-convergence.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-info.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-info.html
index b3e072a..501d7ac 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-info.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-management.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-management.html
index 82fddae..8e0222d 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/dependency-management.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/index.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/index.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/index.html
index 816d9c8..b6c9d0c 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/index.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/integration.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/integration.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/integration.html
index 425d6ea..5ba5338 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/integration.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/issue-tracking.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/issue-tracking.html
index 603ace3..6ea0933 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/issue-tracking.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/license.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/license.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/license.html
index 845b1c2..2086910 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/license.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/mail-lists.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/mail-lists.html
index fed56f1..3770c14 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/mail-lists.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugin-management.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugin-management.html
index 9e438c2..8e8e095 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugin-management.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugins.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugins.html
index be53873..2fcd717 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/plugins.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -226,7 +226,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-info.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-info.html
index d393ae5..6d055fc 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-info.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-reports.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-reports.html
index cc84bb3..73d55b1 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-reports.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-summary.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-summary.html
index d2c37bf..f26761a 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/project-summary.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/source-repository.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/source-repository.html
index c8b4c23..6ce5749 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/source-repository.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-client-project/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-client-project/team-list.html b/hbase-build-configuration/hbase-archetypes/hbase-client-project/team-list.html
index d251409..4b32328 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-client-project/team-list.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-client archetype &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/checkstyle.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
index d02951b..1cf2762 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/checkstyle.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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -244,7 +244,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependencies.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependencies.html
index 5a7e930..9a95db4 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependencies.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -4194,7 +4194,7 @@ built on Jackson JSON processor</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
index 0fc1bd4..6594d9f 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-info.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
index 51a1e5a..a5a7c35 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-management.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
index ae75328..199ac00 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 


[04/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/index.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/index.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/index.html
index 4901284..a6c598c 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/index.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/integration.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/integration.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/integration.html
index 6dbd075..9c98b41 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/integration.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
index 0c6a926..e308754 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/license.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/license.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/license.html
index cb5ff60..bfc185e 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/license.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/mail-lists.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
index c54427d..f567719 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugin-management.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
index c19f7a6..2faa1c6 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugins.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugins.html
index ebf1848..0e0a30b 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/plugins.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -226,7 +226,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-info.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-info.html
index 44faad3..2db1650 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-info.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-reports.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-reports.html
index de862ee..307ae95 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-reports.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-summary.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-summary.html
index b36f968..3b0bbc0 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/project-summary.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/source-repository.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/source-repository.html
index 3674f2d..74b2bb7 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/source-repository.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/team-list.html b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/team-list.html
index e4b88f0..40749ca 100644
--- a/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/team-list.html
+++ b/hbase-build-configuration/hbase-archetypes/hbase-shaded-client-project/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Exemplar for hbase-shaded-client archetype &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/index.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/index.html b/hbase-build-configuration/hbase-archetypes/index.html
index 5f149b8..6208c7e 100644
--- a/hbase-build-configuration/hbase-archetypes/index.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -135,7 +135,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/integration.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/integration.html b/hbase-build-configuration/hbase-archetypes/integration.html
index 4e18073..b93905d 100644
--- a/hbase-build-configuration/hbase-archetypes/integration.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/issue-tracking.html b/hbase-build-configuration/hbase-archetypes/issue-tracking.html
index de14902..aea1f5b 100644
--- a/hbase-build-configuration/hbase-archetypes/issue-tracking.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/license.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/license.html b/hbase-build-configuration/hbase-archetypes/license.html
index be06eef..574e7cd 100644
--- a/hbase-build-configuration/hbase-archetypes/license.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/mail-lists.html b/hbase-build-configuration/hbase-archetypes/mail-lists.html
index c194d73..594c0aa 100644
--- a/hbase-build-configuration/hbase-archetypes/mail-lists.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/plugin-management.html b/hbase-build-configuration/hbase-archetypes/plugin-management.html
index 81671a6..2c28f1c 100644
--- a/hbase-build-configuration/hbase-archetypes/plugin-management.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/plugins.html b/hbase-build-configuration/hbase-archetypes/plugins.html
index c9b456f..2ae76c4 100644
--- a/hbase-build-configuration/hbase-archetypes/plugins.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -214,7 +214,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/project-info.html b/hbase-build-configuration/hbase-archetypes/project-info.html
index a060034..fc2d901 100644
--- a/hbase-build-configuration/hbase-archetypes/project-info.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/project-summary.html b/hbase-build-configuration/hbase-archetypes/project-summary.html
index 76156d9..afeb7fb 100644
--- a/hbase-build-configuration/hbase-archetypes/project-summary.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -163,7 +163,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/source-repository.html b/hbase-build-configuration/hbase-archetypes/source-repository.html
index 451c0dd..97fb96e 100644
--- a/hbase-build-configuration/hbase-archetypes/source-repository.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-archetypes/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-archetypes/team-list.html b/hbase-build-configuration/hbase-archetypes/team-list.html
index b531a40..77edc0b 100644
--- a/hbase-build-configuration/hbase-archetypes/team-list.html
+++ b/hbase-build-configuration/hbase-archetypes/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Archetypes &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/checkstyle.html b/hbase-build-configuration/hbase-spark/checkstyle.html
index e58e6f2..8e33b9c 100644
--- a/hbase-build-configuration/hbase-spark/checkstyle.html
+++ b/hbase-build-configuration/hbase-spark/checkstyle.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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -517,7 +517,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/dependencies.html b/hbase-build-configuration/hbase-spark/dependencies.html
index f179362..54fbc0d 100644
--- a/hbase-build-configuration/hbase-spark/dependencies.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -5692,7 +5692,7 @@ file comparators, endian transformation classes, and much more.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/dependency-convergence.html b/hbase-build-configuration/hbase-spark/dependency-convergence.html
index 7b99a84..ed00006 100644
--- a/hbase-build-configuration/hbase-spark/dependency-convergence.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/dependency-info.html b/hbase-build-configuration/hbase-spark/dependency-info.html
index ba5d879..6af4f6c 100644
--- a/hbase-build-configuration/hbase-spark/dependency-info.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -147,7 +147,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/dependency-management.html b/hbase-build-configuration/hbase-spark/dependency-management.html
index cbd67ec..5b4df1f 100644
--- a/hbase-build-configuration/hbase-spark/dependency-management.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/index.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/index.html b/hbase-build-configuration/hbase-spark/index.html
index 1618a97..609643f 100644
--- a/hbase-build-configuration/hbase-spark/index.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/integration.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/integration.html b/hbase-build-configuration/hbase-spark/integration.html
index 927a3fb..803d41a 100644
--- a/hbase-build-configuration/hbase-spark/integration.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/issue-tracking.html b/hbase-build-configuration/hbase-spark/issue-tracking.html
index 62c548e..378a642 100644
--- a/hbase-build-configuration/hbase-spark/issue-tracking.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/license.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/license.html b/hbase-build-configuration/hbase-spark/license.html
index 0dbe415..7b82ecc 100644
--- a/hbase-build-configuration/hbase-spark/license.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/mail-lists.html b/hbase-build-configuration/hbase-spark/mail-lists.html
index fab5f04..181d907 100644
--- a/hbase-build-configuration/hbase-spark/mail-lists.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/plugin-management.html b/hbase-build-configuration/hbase-spark/plugin-management.html
index baee64a..bab3516 100644
--- a/hbase-build-configuration/hbase-spark/plugin-management.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/plugins.html b/hbase-build-configuration/hbase-spark/plugins.html
index 40f31a9..914603b 100644
--- a/hbase-build-configuration/hbase-spark/plugins.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -238,7 +238,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/project-info.html b/hbase-build-configuration/hbase-spark/project-info.html
index c7e5ab7..be548ec 100644
--- a/hbase-build-configuration/hbase-spark/project-info.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/project-reports.html b/hbase-build-configuration/hbase-spark/project-reports.html
index dca69ee..bb89956 100644
--- a/hbase-build-configuration/hbase-spark/project-reports.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -131,7 +131,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/project-summary.html b/hbase-build-configuration/hbase-spark/project-summary.html
index bbb3772..0d06096 100644
--- a/hbase-build-configuration/hbase-spark/project-summary.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -166,7 +166,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/source-repository.html b/hbase-build-configuration/hbase-spark/source-repository.html
index 83b09db..3c63d13 100644
--- a/hbase-build-configuration/hbase-spark/source-repository.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/hbase-spark/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/hbase-spark/team-list.html b/hbase-build-configuration/hbase-spark/team-list.html
index 72ff15b..9aeb7a8 100644
--- a/hbase-build-configuration/hbase-spark/team-list.html
+++ b/hbase-build-configuration/hbase-spark/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Spark &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/index.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/index.html b/hbase-build-configuration/index.html
index b25630d..e3b879f 100644
--- a/hbase-build-configuration/index.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -119,7 +119,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/integration.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/integration.html b/hbase-build-configuration/integration.html
index 47f9677..80b88b4 100644
--- a/hbase-build-configuration/integration.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/issue-tracking.html b/hbase-build-configuration/issue-tracking.html
index b788292..7c03e81 100644
--- a/hbase-build-configuration/issue-tracking.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/license.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/license.html b/hbase-build-configuration/license.html
index 4f4101f..9823e42 100644
--- a/hbase-build-configuration/license.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/mail-lists.html b/hbase-build-configuration/mail-lists.html
index d68b42d..d0bebd7 100644
--- a/hbase-build-configuration/mail-lists.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/plugin-management.html b/hbase-build-configuration/plugin-management.html
index 1b692d5..26d0795 100644
--- a/hbase-build-configuration/plugin-management.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/plugins.html b/hbase-build-configuration/plugins.html
index 34f01e6..c929ea7 100644
--- a/hbase-build-configuration/plugins.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -214,7 +214,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/project-info.html b/hbase-build-configuration/project-info.html
index 25e4c10..e45f5ad 100644
--- a/hbase-build-configuration/project-info.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -167,7 +167,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/project-summary.html b/hbase-build-configuration/project-summary.html
index 7ff2234..9359463 100644
--- a/hbase-build-configuration/project-summary.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -163,7 +163,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/source-repository.html b/hbase-build-configuration/source-repository.html
index 7a4ada7..673abb4 100644
--- a/hbase-build-configuration/source-repository.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -134,7 +134,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-build-configuration/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/team-list.html b/hbase-build-configuration/team-list.html
index 8d5a1c7..5179632 100644
--- a/hbase-build-configuration/team-list.html
+++ b/hbase-build-configuration/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase - Build Configuration &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -547,7 +547,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/checkstyle.html b/hbase-shaded-check-invariants/checkstyle.html
index 5f5ca98..57c0c34 100644
--- a/hbase-shaded-check-invariants/checkstyle.html
+++ b/hbase-shaded-check-invariants/checkstyle.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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -150,7 +150,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/dependencies.html b/hbase-shaded-check-invariants/dependencies.html
index 31ad5b9..b456872 100644
--- a/hbase-shaded-check-invariants/dependencies.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -2883,7 +2883,7 @@ Jackson JSON processor's data binding functionality.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/dependency-convergence.html b/hbase-shaded-check-invariants/dependency-convergence.html
index f284a2b..c2d3974 100644
--- a/hbase-shaded-check-invariants/dependency-convergence.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -829,7 +829,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/dependency-info.html b/hbase-shaded-check-invariants/dependency-info.html
index 2ac59c4..52b7bf8 100644
--- a/hbase-shaded-check-invariants/dependency-info.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -148,7 +148,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/dependency-management.html b/hbase-shaded-check-invariants/dependency-management.html
index 7aa0e40..d39bdef 100644
--- a/hbase-shaded-check-invariants/dependency-management.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -810,7 +810,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/index.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/index.html b/hbase-shaded-check-invariants/index.html
index 0f2bcb6..eb06732 100644
--- a/hbase-shaded-check-invariants/index.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; About</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -122,7 +122,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/integration.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/integration.html b/hbase-shaded-check-invariants/integration.html
index 761f04a..533e460 100644
--- a/hbase-shaded-check-invariants/integration.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -126,7 +126,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/issue-tracking.html b/hbase-shaded-check-invariants/issue-tracking.html
index 3d92fe8..0f53f51 100644
--- a/hbase-shaded-check-invariants/issue-tracking.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -123,7 +123,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/license.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/license.html b/hbase-shaded-check-invariants/license.html
index 78d36d8..054ec45 100644
--- a/hbase-shaded-check-invariants/license.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/mail-lists.html b/hbase-shaded-check-invariants/mail-lists.html
index a6bdf8a..a84df0c 100644
--- a/hbase-shaded-check-invariants/mail-lists.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -176,7 +176,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/plugin-management.html b/hbase-shaded-check-invariants/plugin-management.html
index 2cf7592..6713577 100644
--- a/hbase-shaded-check-invariants/plugin-management.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -271,7 +271,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/plugins.html b/hbase-shaded-check-invariants/plugins.html
index 263a936..0a53f1a 100644
--- a/hbase-shaded-check-invariants/plugins.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -218,7 +218,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/project-info.html b/hbase-shaded-check-invariants/project-info.html
index ba65257..f9c186e 100644
--- a/hbase-shaded-check-invariants/project-info.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -170,7 +170,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/hbase-shaded-check-invariants/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-shaded-check-invariants/project-reports.html b/hbase-shaded-check-invariants/project-reports.html
index ac463d5..45377b2 100644
--- a/hbase-shaded-check-invariants/project-reports.html
+++ b/hbase-shaded-check-invariants/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="20171211" />
+    <meta name="Date-Revision-yyyymmdd" content="20171212" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase Shaded Packaging Invariants &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -128,7 +128,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2017-12-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2017-12-12</li>
             </p>
                 </div>
 


[06/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on after<a name="line.704"></a>
-<span class="sourceLineNo">705</span>              /

<TRUNCATED>

[02/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
index 2ef9e16..70f9e92 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":10};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -109,15 +109,17 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.58">TestWALMonotonicallyIncreasingSeqId</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.78">TestWALMonotonicallyIncreasingSeqId</a>
 extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
-<div class="block">Test for HBASE-17471
- MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete
- path. Other write paths like increment/append still assign mvcc in ringbuffer's consumer
- thread. If put and increment are used parallel. Then seqid in WAL may not increase monotonically
- Disorder in wals will lead to data loss.
- This case use two thread to put and increment at the same time in a single region.
- Then check the seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail</div>
+<div class="block">Test for HBASE-17471.
+ <p>
+ MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete path. Other
+ write paths like increment/append still assign mvcc in ringbuffer's consumer thread. If put and
+ increment are used parallel. Then seqid in WAL may not increase monotonically Disorder in wals
+ will lead to data loss.
+ <p>
+ This case use two thread to put and increment at the same time in a single region. Then check the
+ seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail</div>
 </li>
 </ul>
 </div>
@@ -164,29 +166,21 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#fileSystem">fileSystem</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>static <a href="http://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/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED">KEY_SEED</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><code>private static char[]</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED_CHARS">KEY_SEED_CHARS</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><code>private static int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#KEY_SEED_LEN">KEY_SEED_LEN</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#latch">latch</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
-<td class="colFirst"><code>(package private) org.apache.commons.logging.Log</code></td>
+<tr class="altColor">
+<td class="colFirst"><code>private org.apache.commons.logging.Log</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>org.junit.rules.TestName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#name">name</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.HRegion</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#region">region</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
@@ -200,6 +194,10 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#walConf">walConf</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code><a href="http://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/regionserver/TestWALMonotonicallyIncreasingSeqId.html#walProvider">walProvider</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.wal.WALFactory</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#wals">wals</a></span></code>&nbsp;</td>
 </tr>
@@ -230,26 +228,47 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 </a>
 <h3>Method Summary</h3>
 <table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>private org.apache.hadoop.hbase.HTableDescriptor</code></td>
+<td class="colFirst"><code>private org.apache.hadoop.hbase.wal.WAL.Reader</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#createReader-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">createReader</a></span>(org.apache.hadoop.fs.Path&nbsp;logPath,
+            org.apache.hadoop.fs.Path&nbsp;oldWalsDir)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>static <a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#data--">data</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>private org.apache.hadoop.hbase.client.TableDescriptor</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#getTableDesc-org.apache.hadoop.hbase.TableName-byte:A...-">getTableDesc</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
             byte[]...&nbsp;families)</code>&nbsp;</td>
 </tr>
-<tr id="i1" class="rowColor">
-<td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.Region</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#initHRegion-org.apache.hadoop.hbase.HTableDescriptor-byte:A-byte:A-int-">initHRegion</a></span>(org.apache.hadoop.hbase.HTableDescriptor&nbsp;htd,
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.HRegion</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#initHRegion-org.apache.hadoop.hbase.client.TableDescriptor-byte:A-byte:A-int-">initHRegion</a></span>(org.apache.hadoop.hbase.client.TableDescriptor&nbsp;htd,
            byte[]&nbsp;startKey,
            byte[]&nbsp;stopKey,
            int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#TestWALMonotonicallyIncreasingSeqId--">TestWALMonotonicallyIncreasingSeqId</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#setUp--">setUp</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#tearDown--">tearDown</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#tearDownAfterClass--">tearDownAfterClass</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#testWALMonotonicallyIncreasingSeqId--">testWALMonotonicallyIncreasingSeqId</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -279,7 +298,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.59">LOG</a></pre>
+<pre>private final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.79">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -288,7 +307,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.60">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.80">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="testDir">
@@ -297,7 +316,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDir</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.61">testDir</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.81">testDir</a></pre>
 </li>
 </ul>
 <a name="wals">
@@ -306,7 +325,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>wals</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.wal.WALFactory <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.62">wals</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.wal.WALFactory <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.82">wals</a></pre>
 </li>
 </ul>
 <a name="fileSystem">
@@ -315,7 +334,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>fileSystem</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.63">fileSystem</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.83">fileSystem</a></pre>
 </li>
 </ul>
 <a name="walConf">
@@ -324,38 +343,25 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>walConf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.64">walConf</a></pre>
-</li>
-</ul>
-<a name="KEY_SEED">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>KEY_SEED</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.66">KEY_SEED</a></pre>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestWALMonotonicallyIncreasingSeqId.KEY_SEED">Constant Field Values</a></dd>
-</dl>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.84">walConf</a></pre>
 </li>
 </ul>
-<a name="KEY_SEED_LEN">
+<a name="region">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>KEY_SEED_LEN</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.68">KEY_SEED_LEN</a></pre>
+<h4>region</h4>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.85">region</a></pre>
 </li>
 </ul>
-<a name="KEY_SEED_CHARS">
+<a name="walProvider">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>KEY_SEED_CHARS</h4>
-<pre>private static final&nbsp;char[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.70">KEY_SEED_CHARS</a></pre>
+<h4>walProvider</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.88">walProvider</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -364,7 +370,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.73">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.91">name</a></pre>
 </li>
 </ul>
 <a name="latch">
@@ -373,7 +379,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>latch</h4>
-<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.105">latch</a></pre>
+<pre><a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.126">latch</a></pre>
 </li>
 </ul>
 </li>
@@ -390,7 +396,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestWALMonotonicallyIncreasingSeqId</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.58">TestWALMonotonicallyIncreasingSeqId</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.78">TestWALMonotonicallyIncreasingSeqId</a>()</pre>
 </li>
 </ul>
 </li>
@@ -401,40 +407,106 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="data--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>data</h4>
+<pre>public static&nbsp;<a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.94">data</a>()</pre>
+</li>
+</ul>
 <a name="getTableDesc-org.apache.hadoop.hbase.TableName-byte:A...-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDesc</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.75">getTableDesc</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
-                                                              byte[]...&nbsp;families)</pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.TableDescriptor&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.98">getTableDesc</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                                                                    byte[]...&nbsp;families)</pre>
 </li>
 </ul>
-<a name="initHRegion-org.apache.hadoop.hbase.HTableDescriptor-byte:A-byte:A-int-">
+<a name="initHRegion-org.apache.hadoop.hbase.client.TableDescriptor-byte:A-byte:A-int-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.Region&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.86">initHRegion</a>(org.apache.hadoop.hbase.HTableDescriptor&nbsp;htd,
-                                                                byte[]&nbsp;startKey,
-                                                                byte[]&nbsp;stopKey,
-                                                                int&nbsp;replicaId)
-                                                         throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.106">initHRegion</a>(org.apache.hadoop.hbase.client.TableDescriptor&nbsp;htd,
+                                                                 byte[]&nbsp;startKey,
+                                                                 byte[]&nbsp;stopKey,
+                                                                 int&nbsp;replicaId)
+                                                          throws <a href="http://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="http://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="TestWALMonotonicallyIncreasingSeqId--">
+<a name="setUp--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUp</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.180">setUp</a>()
+           throws <a href="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="tearDown--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDown</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.188">tearDown</a>()
+              throws <a href="http://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="http://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="tearDownAfterClass--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDownAfterClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.195">tearDownAfterClass</a>()
+                               throws <a href="http://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="http://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="createReader-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>createReader</h4>
+<pre>private&nbsp;org.apache.hadoop.hbase.wal.WAL.Reader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.199">createReader</a>(org.apache.hadoop.fs.Path&nbsp;logPath,
+                                                            org.apache.hadoop.fs.Path&nbsp;oldWalsDir)
+                                                     throws <a href="http://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="http://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="testWALMonotonicallyIncreasingSeqId--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>TestWALMonotonicallyIncreasingSeqId</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.160">TestWALMonotonicallyIncreasingSeqId</a>()
+<h4>testWALMonotonicallyIncreasingSeqId</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#line.208">testWALMonotonicallyIncreasingSeqId</a>()
                                          throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
index 85deb89..7933909 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
@@ -1325,9 +1325,7 @@
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></td>
 <td class="colLast">
-<div class="block">Test for HBASE-17471
- MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete
- path.</div>
+<div class="block">Test for HBASE-17471.</div>
 </td>
 </tr>
 <tr class="rowColor">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 892325d..2e07600 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -628,10 +628,10 @@
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/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/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>
-<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/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/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 da70492..5103624 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,9 +253,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/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/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.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>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/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 f65a9c9..644d9f7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -136,9 +136,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://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="http://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="http://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/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
index 06992c4..f5e1b5f 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.IncThread.html
@@ -26,199 +26,226 @@
 <span class="sourceLineNo">018</span> */<a name="line.18"></a>
 <span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.regionserver;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import org.apache.commons.logging.Log;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.commons.logging.LogFactory;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import org.apache.hadoop.conf.Configuration;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.fs.FileSystem;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.fs.Path;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.*;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.client.*;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.junit.Assert;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.junit.Rule;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.junit.Test;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.junit.experimental.categories.Category;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.junit.rules.TestName;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.io.IOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.ArrayList;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import java.util.List;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import java.util.concurrent.CountDownLatch;<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> * Test for HBASE-17471<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * path. Other write paths like increment/append still assign mvcc in ringbuffer's consumer<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * thread. If put and increment are used parallel. Then seqid in WAL may not increase monotonically<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * Disorder in wals will lead to data loss.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * This case use two thread to put and increment at the same time in a single region.<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * Then check the seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail<a name="line.54"></a>
-<span class="sourceLineNo">055</span> *<a name="line.55"></a>
-<span class="sourceLineNo">056</span> */<a name="line.56"></a>
-<span class="sourceLineNo">057</span>@Category({RegionServerTests.class, SmallTests.class})<a name="line.57"></a>
-<span class="sourceLineNo">058</span>public class TestWALMonotonicallyIncreasingSeqId {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  final Log LOG = LogFactory.getLog(getClass());<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static Path testDir = TEST_UTIL.getDataTestDir("TestWALMonotonicallyIncreasingSeqId");<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private WALFactory wals;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private FileSystem fileSystem;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private Configuration walConf;<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static final String KEY_SEED = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private static final int KEY_SEED_LEN = KEY_SEED.length();<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private static final char[] KEY_SEED_CHARS = KEY_SEED.toCharArray();<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @Rule<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public TestName name = new TestName();<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private HTableDescriptor getTableDesc(TableName tableName, byte[]... families) {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    for (byte[] family : families) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      // Set default to be three versions.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      hcd.setMaxVersions(Integer.MAX_VALUE);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      htd.addFamily(hcd);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    return htd;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private Region initHRegion(HTableDescriptor htd, byte[] startKey, byte[] stopKey, int replicaId)<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      throws IOException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    conf.setBoolean("hbase.hregion.mvcc.preassign", false);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), startKey, stopKey, false, 0, replicaId);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    fileSystem =  tableDir.getFileSystem(conf);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    HRegionFileSystem fs = new HRegionFileSystem(conf, fileSystem, tableDir, info);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    final Configuration walConf = new Configuration(conf);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    FSUtils.setRootDir(walConf, tableDir);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    this.walConf = walConf;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    wals = new WALFactory(walConf, null, "log_" + replicaId);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    HRegion region = HRegion.createHRegion(info, TEST_UTIL.getDefaultRootDirPath(), conf, htd,<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        wals.getWAL(info.getEncodedNameAsBytes(), info.getTable().getNamespace()));<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return region;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  CountDownLatch latch = new CountDownLatch(1);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  public class PutThread extends Thread {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    HRegion region;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public PutThread(HRegion region) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      this.region = region;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public void run() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      try {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        for(int i = 0; i &lt; 100; i++) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>          byte[] row = Bytes.toBytes("putRow" + i);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>          Put put = new Put(row);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          put.addColumn("cf".getBytes(), Bytes.toBytes(0), Bytes.toBytes(""));<a name="line.118"></a>
-<span class="sourceLineNo">119</span>          //put.setDurability(Durability.ASYNC_WAL);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>          latch.await();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>          region.batchMutate(new Mutation[]{put});<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          Thread.sleep(10);<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">021</span>import static org.junit.Assert.fail;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.ArrayList;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.concurrent.CountDownLatch;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.commons.logging.Log;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.commons.logging.LogFactory;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.Path;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<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.TableName;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Put;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.After;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.AfterClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.Before;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Rule;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.Test;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.experimental.categories.Category;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.rules.TestName;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.runner.RunWith;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.runners.Parameterized;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.runners.Parameterized.Parameter;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.runners.Parameterized.Parameters;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * Test for HBASE-17471.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete path. Other<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * write paths like increment/append still assign mvcc in ringbuffer's consumer thread. If put and<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * increment are used parallel. Then seqid in WAL may not increase monotonically Disorder in wals<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * will lead to data loss.<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * &lt;p&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * This case use two thread to put and increment at the same time in a single region. Then check the<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * seqid in WAL. If seqid is wal is not monotonically increasing, this case will fail<a name="line.74"></a>
+<span class="sourceLineNo">075</span> */<a name="line.75"></a>
+<span class="sourceLineNo">076</span>@RunWith(Parameterized.class)<a name="line.76"></a>
+<span class="sourceLineNo">077</span>@Category({ RegionServerTests.class, SmallTests.class })<a name="line.77"></a>
+<span class="sourceLineNo">078</span>public class TestWALMonotonicallyIncreasingSeqId {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final Log LOG = LogFactory.getLog(getClass());<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static Path testDir = TEST_UTIL.getDataTestDir("TestWALMonotonicallyIncreasingSeqId");<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private WALFactory wals;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private FileSystem fileSystem;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private Configuration walConf;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private HRegion region;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  @Parameter<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public String walProvider;<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Parameters(name = "{index}: wal={0}")<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static List&lt;Object[]&gt; data() {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return Arrays.asList(new Object[] { "asyncfs" }, new Object[] { "filesystem" });<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private TableDescriptor getTableDesc(TableName tableName, byte[]... families) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    Arrays.stream(families).map(<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      f -&gt; ColumnFamilyDescriptorBuilder.newBuilder(f).setMaxVersions(Integer.MAX_VALUE).build())<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        .forEachOrdered(builder::addColumnFamily);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return builder.build();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private HRegion initHRegion(TableDescriptor htd, byte[] startKey, byte[] stopKey, int replicaId)<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      throws IOException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    conf.set("hbase.wal.provider", walProvider);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    conf.setBoolean("hbase.hregion.mvcc.preassign", false);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    Path tableDir = FSUtils.getTableDir(testDir, htd.getTableName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    RegionInfo info = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(startKey)<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        .setEndKey(stopKey).setReplicaId(replicaId).setRegionId(0).build();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    fileSystem = tableDir.getFileSystem(conf);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    final Configuration walConf = new Configuration(conf);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    FSUtils.setRootDir(walConf, tableDir);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    this.walConf = walConf;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    wals = new WALFactory(walConf, null, "log_" + replicaId);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    HRegion region = HRegion.createHRegion(info, TEST_UTIL.getDefaultRootDirPath(), conf, htd,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      wals.getWAL(info.getEncodedNameAsBytes(), info.getTable().getNamespace()));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return region;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
 <span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>      } catch (Throwable t) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        LOG.warn("Error happend when Increment: ", t);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public class IncThread extends Thread {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    HRegion region;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public IncThread(HRegion region) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.region = region;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    public void run() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      try {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        for(int i = 0; i &lt; 100; i++) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          byte[] row = Bytes.toBytes("incrementRow" + i);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          Increment inc = new Increment(row);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          inc.addColumn("cf".getBytes(), Bytes.toBytes(0), 1);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          //inc.setDurability(Durability.ASYNC_WAL);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          region.increment(inc);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          latch.countDown();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          Thread.sleep(10);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } catch (Throwable t) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        LOG.warn("Error happend when Put: ", t);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      }<a name="line.154"></a>
+<span class="sourceLineNo">126</span>  CountDownLatch latch = new CountDownLatch(1);<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public class PutThread extends Thread {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    HRegion region;<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    public PutThread(HRegion region) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.region = region;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    @Override<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    public void run() {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      try {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        for (int i = 0; i &lt; 100; i++) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          byte[] row = Bytes.toBytes("putRow" + i);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          Put put = new Put(row);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          put.addColumn("cf".getBytes(), Bytes.toBytes(0), Bytes.toBytes(""));<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          latch.await();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          region.batchMutate(new Mutation[] { put });<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          Thread.sleep(10);<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>      } catch (Throwable t) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        LOG.warn("Error happend when Increment: ", t);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public class IncThread extends Thread {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    HRegion region;<a name="line.154"></a>
 <span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Test<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public void TestWALMonotonicallyIncreasingSeqId() throws Exception {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    byte[][] families = new byte[][] {Bytes.toBytes("cf")};<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    byte[] qf = Bytes.toBytes("cq");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    HTableDescriptor htd = getTableDesc(TableName.valueOf(name.getMethodName()), families);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    HRegion region = (HRegion)initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    List&lt;Thread&gt; putThreads = new ArrayList&lt;&gt;();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    for(int i = 0; i &lt; 1; i++) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      putThreads.add(new PutThread(region));<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    IncThread incThread = new IncThread(region);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    for(int i = 0; i &lt; 1; i++) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      putThreads.get(i).start();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    incThread.start();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    incThread.join();<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    Path logPath = ((FSHLog) region.getWAL()).getCurrentFileName();<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    region.getWAL().rollWriter();<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Thread.sleep(10);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Path hbaseDir = new Path(walConf.get(HConstants.HBASE_DIR));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    Path oldWalsDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    WAL.Reader reader = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      reader = wals.createReader(fileSystem, logPath);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    } catch (Throwable t) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      reader = wals.createReader(fileSystem, new Path(oldWalsDir, logPath.getName()));<a name="line.185"></a>
+<span class="sourceLineNo">156</span>    public IncThread(HRegion region) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      this.region = region;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    public void run() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      try {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        for (int i = 0; i &lt; 100; i++) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>          byte[] row = Bytes.toBytes("incrementRow" + i);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          Increment inc = new Increment(row);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          inc.addColumn("cf".getBytes(), Bytes.toBytes(0), 1);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          // inc.setDurability(Durability.ASYNC_WAL);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          region.increment(inc);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>          latch.countDown();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          Thread.sleep(10);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>      } catch (Throwable t) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        LOG.warn("Error happend when Put: ", t);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Before<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void setUp() throws IOException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    byte[][] families = new byte[][] { Bytes.toBytes("cf") };<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    TableDescriptor htd = getTableDesc(<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      TableName.valueOf(name.getMethodName().replaceAll("[^0-9A-Za-z_]", "_")), families);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    region = initHRegion(htd, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, 0);<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>    WAL.Entry e;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    try {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      long currentMaxSeqid = 0;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      while ((e = reader.next()) != null) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        if (!WALEdit.isMetaEditFamily(e.getEdit().getCells().get(0))) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>          long currentSeqid = e.getKey().getSequenceId();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          if(currentSeqid &gt; currentMaxSeqid) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            currentMaxSeqid = currentSeqid;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          } else {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            Assert.fail("Current max Seqid is " + currentMaxSeqid<a name="line.197"></a>
-<span class="sourceLineNo">198</span>                + ", but the next seqid in wal is smaller:" + currentSeqid);<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>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    } finally {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if(reader != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        reader.close();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if(region != null) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        region.close();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<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">187</span>  @After<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public void tearDown() throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    if (region != null) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      region.close();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  @AfterClass<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public static void tearDownAfterClass() throws IOException {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    TEST_UTIL.cleanupTestDir();<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private WAL.Reader createReader(Path logPath, Path oldWalsDir) throws IOException {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      return wals.createReader(fileSystem, logPath);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    } catch (IOException e) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      return wals.createReader(fileSystem, new Path(oldWalsDir, logPath.getName()));<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  @Test<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public void testWALMonotonicallyIncreasingSeqId() throws Exception {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    List&lt;Thread&gt; putThreads = new ArrayList&lt;&gt;();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    for (int i = 0; i &lt; 1; i++) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      putThreads.add(new PutThread(region));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    IncThread incThread = new IncThread(region);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    for (int i = 0; i &lt; 1; i++) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      putThreads.get(i).start();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    incThread.start();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    incThread.join();<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    Path logPath = ((AbstractFSWAL&lt;?&gt;) region.getWAL()).getCurrentFileName();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    region.getWAL().rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    Thread.sleep(10);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    Path hbaseDir = new Path(walConf.get(HConstants.HBASE_DIR));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    Path oldWalsDir = new Path(hbaseDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    try (WAL.Reader reader = createReader(logPath, oldWalsDir)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      long currentMaxSeqid = 0;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      for (WAL.Entry e; (e = reader.next()) != null;) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        if (!WALEdit.isMetaEditFamily(e.getEdit().getCells().get(0))) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          long currentSeqid = e.getKey().getSequenceId();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          if (currentSeqid &gt; currentMaxSeqid) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>            currentMaxSeqid = currentSeqid;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          } else {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            fail("Current max Seqid is " + currentMaxSeqid +<a name="line.233"></a>
+<span class="sourceLineNo">234</span>              ", but the next seqid in wal is smaller:" + currentSeqid);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span>}<a name="line.240"></a>
 
 
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.LeaseManager.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on after<a name="lin

<TRUNCATED>

[15/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.CancelOnClose.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on after<a name

<TRUNCATED>

[12/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.FileCreator.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only move on after<a name="line.704

<TRUNCATED>

[10/18] hbase-site git commit: Published site at .

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/1473a64a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
index 167e43a..e7d7c88 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.NameNodeException.html
@@ -200,7 +200,7 @@
 <span class="sourceLineNo">192</span><a name="line.192"></a>
 <span class="sourceLineNo">193</span>  // helper class for creating data checksum.<a name="line.193"></a>
 <span class="sourceLineNo">194</span>  private interface ChecksumCreater {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    DataChecksum createChecksum(Object conf);<a name="line.195"></a>
+<span class="sourceLineNo">195</span>    DataChecksum createChecksum(DFSClient client);<a name="line.195"></a>
 <span class="sourceLineNo">196</span>  }<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
 <span class="sourceLineNo">198</span>  private static final ChecksumCreater CHECKSUM_CREATER;<a name="line.198"></a>
@@ -208,12 +208,12 @@
 <span class="sourceLineNo">200</span>  // helper class for creating files.<a name="line.200"></a>
 <span class="sourceLineNo">201</span>  private interface FileCreator {<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    default HdfsFileStatus create(ClientProtocol instance, String src, FsPermission masked,<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        boolean createParent, short replication, long blockSize,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        CryptoProtocolVersion[] supportedVersions) throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">203</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        throws Exception {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>      try {<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        return (HdfsFileStatus) createObject(instance, src, masked, clientName, flag, createParent,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>            replication, blockSize, supportedVersions);<a name="line.208"></a>
+<span class="sourceLineNo">208</span>          replication, blockSize, supportedVersions);<a name="line.208"></a>
 <span class="sourceLineNo">209</span>      } catch (InvocationTargetException e) {<a name="line.209"></a>
 <span class="sourceLineNo">210</span>        if (e.getCause() instanceof Exception) {<a name="line.210"></a>
 <span class="sourceLineNo">211</span>          throw (Exception) e.getCause();<a name="line.211"></a>
@@ -223,650 +223,654 @@
 <span class="sourceLineNo">215</span>      }<a name="line.215"></a>
 <span class="sourceLineNo">216</span>    };<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        String clientName, EnumSetWritable&lt;CreateFlag&gt; flag,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        boolean createParent, short replication, long blockSize,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private static final FileCreator FILE_CREATOR;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    isClientRunningMethod.setAccessible(true);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return new DFSClientAdaptor() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>      @Override<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      public boolean isClientRunning(DFSClient client) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        try {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          throw new RuntimeException(e);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    };<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    Method beginFileLeaseMethod =<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    endFileLeaseMethod.setAccessible(true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new LeaseManager() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      public void begin(DFSClient client, long inodeId) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          throw new RuntimeException(e);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>      @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      public void end(DFSClient client, long inodeId) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        try {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          throw new RuntimeException(e);<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>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      throws NoSuchMethodException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    @SuppressWarnings("rawtypes")<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    try {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          .asSubclass(Enum.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    } catch (ClassNotFoundException e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please "<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + "HBASE-16110 for more information.";<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      LOG.error(msg, e);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      throw new Error(msg, e);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @SuppressWarnings("unchecked")<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    Method combineHeaderMethod =<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    Method getStatusFromHeaderMethod =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return new PipelineAckStatusGetter() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Status get(PipelineAckProto ack) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          @SuppressWarnings("unchecked")<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          Integer headerFlag;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (flagList.isEmpty()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          } else {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            headerFlag = flagList.get(0);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          throw new RuntimeException(e);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    };<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throws NoSuchMethodException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return new PipelineAckStatusGetter() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      public Status get(PipelineAckProto ack) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>          throw new RuntimeException(e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    };<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws NoSuchMethodException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      return createPipelineAckStatusGetter27();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    } catch (NoSuchMethodException e) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      LOG.debug("Can not get expected methods, should be hadoop 2.6-", e);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    return createPipelineAckStatusGetter26();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    Method setStorageTypeMethod =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    return new StorageTypeSetter() {<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>      @Override<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          throw new RuntimeException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return builder;<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><a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      if (method.getName().equals("addBlock")) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        Method addBlockMethod = method;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          return new BlockAdder() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>            @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>                String[] favoredNodes) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>              try {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                  excludeNodes, fileId, favoredNodes);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              } catch (IllegalAccessException e) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>                throw new RuntimeException(e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              } catch (InvocationTargetException e) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>                throw new RuntimeException(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>        } else {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          return new BlockAdder() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>            @Override<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>                String[] favoredNodes) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              try {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>              } catch (IllegalAccessException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>                throw new RuntimeException(e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              } catch (InvocationTargetException e) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                throw new RuntimeException(e);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              }<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          };<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Class&lt;?&gt; helperClass;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      helperClass = Class.forName(clazzName);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (ClassNotFoundException e) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      LOG.debug(""  + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          helperClass.toString() + " instead.");<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return new PBHelper() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>      @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          throw new RuntimeException(e);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>      @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        try {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          throw new RuntimeException(e);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    };<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  private static ChecksumCreater createChecksumCreater28(Class&lt;?&gt; confClass)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      throws NoSuchMethodException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (Method method : confClass.getMethods()) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      if (method.getName().equals("createChecksum")) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        Method createChecksumMethod = method;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        return new ChecksumCreater() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>          @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          public DataChecksum createChecksum(Object conf) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              return (DataChecksum) createChecksumMethod.invoke(conf, (Object) null);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              throw new RuntimeException(e);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        };<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>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  private static ChecksumCreater createChecksumCreater27(Class&lt;?&gt; confClass)<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      throws NoSuchMethodException {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    createChecksumMethod.setAccessible(true);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return new ChecksumCreater() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span><a name="line.470"></a>
-<span class="sourceLineNo">471</span>      @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      public DataChecksum createChecksum(Object conf) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        try {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          return (DataChecksum) createChecksumMethod.invoke(conf);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          throw new RuntimeException(e);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      }<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    };<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private static ChecksumCreater createChecksumCreater()<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    try {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      return createChecksumCreater28(<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    } catch (ClassNotFoundException e) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return createChecksumCreater27(Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class,<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      String.class);<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            supportedVersions) -&gt; {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions,<a name="line.501"></a>
-<span class="sourceLineNo">502</span>          null);<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>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class, CryptoProtocolVersion[].class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>            supportedVersions) -&gt; {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      return (HdfsFileStatus) createMethod.invoke(instance,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          src, masked, clientName, flag, createParent, replication, blockSize, supportedVersions);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    };<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    try {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      return createFileCreator3();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } catch (NoSuchMethodException e) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return createFileCreator2();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  // cancel the processing if DFSClient is already closed.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    private final DFSClient client;<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>    public CancelOnClose(DFSClient client) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.client = client;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">218</span>    Object createObject(ClientProtocol instance, String src, FsPermission masked, String clientName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        EnumSetWritable&lt;CreateFlag&gt; flag, boolean createParent, short replication, long blockSize,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        CryptoProtocolVersion[] supportedVersions) throws Exception;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private static final FileCreator FILE_CREATOR;<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  private static DFSClientAdaptor createDFSClientAdaptor() throws NoSuchMethodException {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    Method isClientRunningMethod = DFSClient.class.getDeclaredMethod("isClientRunning");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    isClientRunningMethod.setAccessible(true);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return new DFSClientAdaptor() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      @Override<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      public boolean isClientRunning(DFSClient client) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          return (Boolean) isClientRunningMethod.invoke(client);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          throw new RuntimeException(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    };<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  private static LeaseManager createLeaseManager() throws NoSuchMethodException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    Method beginFileLeaseMethod =<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        DFSClient.class.getDeclaredMethod("beginFileLease", long.class, DFSOutputStream.class);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    beginFileLeaseMethod.setAccessible(true);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    Method endFileLeaseMethod = DFSClient.class.getDeclaredMethod("endFileLease", long.class);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    endFileLeaseMethod.setAccessible(true);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return new LeaseManager() {<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>      @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      public void begin(DFSClient client, long inodeId) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          beginFileLeaseMethod.invoke(client, inodeId, null);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          throw new RuntimeException(e);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>      @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      public void end(DFSClient client, long inodeId) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        try {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          endFileLeaseMethod.invoke(client, inodeId);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          throw new RuntimeException(e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    };<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter27()<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throws NoSuchMethodException {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Method getFlagListMethod = PipelineAckProto.class.getMethod("getFlagList");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    @SuppressWarnings("rawtypes")<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    Class&lt;? extends Enum&gt; ecnClass;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    try {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      ecnClass = Class.forName("org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck$ECN")<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          .asSubclass(Enum.class);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    } catch (ClassNotFoundException e) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      String msg = "Couldn't properly initialize the PipelineAck.ECN class. Please " +<a name="line.278"></a>
+<span class="sourceLineNo">279</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          "HBASE-16110 for more information.";<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.error(msg, e);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new Error(msg, e);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    @SuppressWarnings("unchecked")<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Enum&lt;?&gt; disabledECN = Enum.valueOf(ecnClass, "DISABLED");<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    Method getReplyMethod = PipelineAckProto.class.getMethod("getReply", int.class);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    Method combineHeaderMethod =<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        PipelineAck.class.getMethod("combineHeader", ecnClass, Status.class);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    Method getStatusFromHeaderMethod =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        PipelineAck.class.getMethod("getStatusFromHeader", int.class);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    return new PipelineAckStatusGetter() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Status get(PipelineAckProto ack) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          @SuppressWarnings("unchecked")<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          List&lt;Integer&gt; flagList = (List&lt;Integer&gt;) getFlagListMethod.invoke(ack);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          Integer headerFlag;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          if (flagList.isEmpty()) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            Status reply = (Status) getReplyMethod.invoke(ack, 0);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            headerFlag = (Integer) combineHeaderMethod.invoke(null, disabledECN, reply);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          } else {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            headerFlag = flagList.get(0);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          return (Status) getStatusFromHeaderMethod.invoke(null, headerFlag);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          throw new RuntimeException(e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter26()<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      throws NoSuchMethodException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Method getStatusMethod = PipelineAckProto.class.getMethod("getStatus", int.class);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return new PipelineAckStatusGetter() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      public Status get(PipelineAckProto ack) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return (Status) getStatusMethod.invoke(ack, 0);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          throw new RuntimeException(e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  private static PipelineAckStatusGetter createPipelineAckStatusGetter()<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      throws NoSuchMethodException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    try {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      return createPipelineAckStatusGetter27();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } catch (NoSuchMethodException e) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      LOG.debug("Can not get expected method " + e.getMessage() +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          ", this usually because your Hadoop is pre 2.7.0, " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          "try the methods in Hadoop 2.6.x instead.");<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return createPipelineAckStatusGetter26();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private static StorageTypeSetter createStorageTypeSetter() throws NoSuchMethodException {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    Method setStorageTypeMethod =<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        OpWriteBlockProto.Builder.class.getMethod("setStorageType", StorageTypeProto.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    ImmutableMap.Builder&lt;String, StorageTypeProto&gt; builder = ImmutableMap.builder();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    for (StorageTypeProto storageTypeProto : StorageTypeProto.values()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      builder.put(storageTypeProto.name(), storageTypeProto);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    ImmutableMap&lt;String, StorageTypeProto&gt; name2ProtoEnum = builder.build();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return new StorageTypeSetter() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      public OpWriteBlockProto.Builder set(OpWriteBlockProto.Builder builder, Enum&lt;?&gt; storageType) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        Object protoEnum = name2ProtoEnum.get(storageType.name());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          setStorageTypeMethod.invoke(builder, protoEnum);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          throw new RuntimeException(e);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        return builder;<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>  }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private static BlockAdder createBlockAdder() throws NoSuchMethodException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    for (Method method : ClientProtocol.class.getMethods()) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      if (method.getName().equals("addBlock")) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        Method addBlockMethod = method;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        Class&lt;?&gt;[] paramTypes = addBlockMethod.getParameterTypes();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        if (paramTypes[paramTypes.length - 1] == String[].class) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          return new BlockAdder() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>            @Override<a name="line.372"></a>
+<span class="sourceLineNo">373</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                String[] favoredNodes) throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>              try {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                  excludeNodes, fileId, favoredNodes);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>              } catch (IllegalAccessException e) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                throw new RuntimeException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>              } catch (InvocationTargetException e) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                throw new RuntimeException(e);<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>          };<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        } else {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          return new BlockAdder() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            @Override<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            public LocatedBlock addBlock(ClientProtocol namenode, String src, String clientName,<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,<a name="line.392"></a>
+<span class="sourceLineNo">393</span>                String[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>              try {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                return (LocatedBlock) addBlockMethod.invoke(namenode, src, clientName, previous,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                  excludeNodes, fileId, favoredNodes, null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>              } catch (IllegalAccessException e) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                throw new RuntimeException(e);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>              } catch (InvocationTargetException e) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                Throwables.propagateIfPossible(e.getTargetException(), IOException.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                throw new RuntimeException(e);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>              }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          };<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    throw new NoSuchMethodException("Can not find addBlock method in ClientProtocol");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private static PBHelper createPBHelper() throws NoSuchMethodException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    Class&lt;?&gt; helperClass;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    String clazzName = "org.apache.hadoop.hdfs.protocolPB.PBHelperClient";<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      helperClass = Class.forName(clazzName);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    } catch (ClassNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      helperClass = org.apache.hadoop.hdfs.protocolPB.PBHelper.class;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      LOG.debug("" + clazzName + " not found (Hadoop is pre-2.8.0?); using " +<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          helperClass.toString() + " instead.");<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Method convertEBMethod = helperClass.getMethod("convert", ExtendedBlock.class);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Method convertTokenMethod = helperClass.getMethod("convert", Token.class);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return new PBHelper() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      public ExtendedBlockProto convert(ExtendedBlock b) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          return (ExtendedBlockProto) convertEBMethod.invoke(null, b);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          throw new RuntimeException(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public TokenProto convert(Token&lt;?&gt; tok) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        try {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          return (TokenProto) convertTokenMethod.invoke(null, tok);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          throw new RuntimeException(e);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  private static ChecksumCreater createChecksumCreater28(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      throws NoSuchMethodException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    for (Method method : confClass.getMethods()) {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (method.getName().equals("createChecksum")) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        Method createChecksumMethod = method;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        return new ChecksumCreater() {<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>          @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          public DataChecksum createChecksum(DFSClient client) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>              return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client),<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                (Object) null);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              throw new RuntimeException(e);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>        };<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    throw new NoSuchMethodException("Can not find createChecksum method in DfsClientConf");<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  private static ChecksumCreater createChecksumCreater27(Method getConfMethod, Class&lt;?&gt; confClass)<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      throws NoSuchMethodException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    Method createChecksumMethod = confClass.getDeclaredMethod("createChecksum");<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    createChecksumMethod.setAccessible(true);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return new ChecksumCreater() {<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      public DataChecksum createChecksum(DFSClient client) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        try {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          return (DataChecksum) createChecksumMethod.invoke(getConfMethod.invoke(client));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        } catch (IllegalAccessException | InvocationTargetException e) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>          throw new RuntimeException(e);<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">481</span>    };<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  private static ChecksumCreater createChecksumCreater()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      throws NoSuchMethodException, ClassNotFoundException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    Method getConfMethod = DFSClient.class.getMethod("getConf");<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    try {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      return createChecksumCreater28(getConfMethod,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        Class.forName("org.apache.hadoop.hdfs.client.impl.DfsClientConf"));<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    } catch (ClassNotFoundException e) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      LOG.debug("No DfsClientConf class found, should be hadoop 2.7-", e);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return createChecksumCreater27(getConfMethod,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Class.forName("org.apache.hadoop.hdfs.DFSClient$Conf"));<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>  private static FileCreator createFileCreator3() throws NoSuchMethodException {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      CryptoProtocolVersion[].class, String.class);<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        supportedVersions) -&gt; {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        createParent, replication, blockSize, supportedVersions, null);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    };<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  private static FileCreator createFileCreator2() throws NoSuchMethodException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    Method createMethod = ClientProtocol.class.getMethod("create", String.class, FsPermission.class,<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      String.class, EnumSetWritable.class, boolean.class, short.class, long.class,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      CryptoProtocolVersion[].class);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    return (instance, src, masked, clientName, flag, createParent, replication, blockSize,<a name="line.514"></a>
+<span class="sourceLineNo">515</span>        supportedVersions) -&gt; {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      return (HdfsFileStatus) createMethod.invoke(instance, src, masked, clientName, flag,<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        createParent, replication, blockSize, supportedVersions);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    };<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static FileCreator createFileCreator() throws NoSuchMethodException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    try {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      return createFileCreator3();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    } catch (NoSuchMethodException e) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      LOG.debug("ClientProtocol::create wrong number of arguments, should be hadoop 2.x");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    return createFileCreator2();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  // cancel the processing if DFSClient is already closed.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  static final class CancelOnClose implements CancelableProgressable {<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>    private final DFSClient client;<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    public boolean progress() {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  static {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    try {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      BLOCK_ADDER = createBlockAdder();<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      LEASE_MANAGER = createLeaseManager();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      PB_HELPER = createPBHelper();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      FILE_CREATOR = createFileCreator();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    } catch (Exception e) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please "<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          + "update your WAL Provider to not make use of the 'asyncfs' provider. See "<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          + "HBASE-16110 for more information.";<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      LOG.error(msg, e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new Error(msg, e);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  }<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.561"></a>
+<span class="sourceLineNo">535</span>    public CancelOnClose(DFSClient client) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      this.client = client;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>    @Override<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    public boolean progress() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return DFS_CLIENT_ADAPTOR.isClientRunning(client);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>  static {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    try {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      PIPELINE_ACK_STATUS_GETTER = createPipelineAckStatusGetter();<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      STORAGE_TYPE_SETTER = createStorageTypeSetter();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      BLOCK_ADDER = createBlockAdder();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      LEASE_MANAGER = createLeaseManager();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      DFS_CLIENT_ADAPTOR = createDFSClientAdaptor();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      PB_HELPER = createPBHelper();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      CHECKSUM_CREATER = createChecksumCreater();<a name="line.553"></a>
+<span class="sourceLineNo">554</span>      FILE_CREATOR = createFileCreator();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    } catch (Exception e) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      String msg = "Couldn't properly initialize access to HDFS internals. Please " +<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          "update your WAL Provider to not make use of the 'asyncfs' provider. See " +<a name="line.557"></a>
+<span class="sourceLineNo">558</span>          "HBASE-16110 for more information.";<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      LOG.error(msg, e);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new Error(msg, e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
 <span class="sourceLineNo">562</span>  }<a name="line.562"></a>
 <span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.565"></a>
+<span class="sourceLineNo">564</span>  static void beginFileLease(DFSClient client, long inodeId) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LEASE_MANAGER.begin(client, inodeId);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>  }<a name="line.566"></a>
 <span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return CHECKSUM_CREATER.createChecksum(client.getConf());<a name="line.569"></a>
+<span class="sourceLineNo">568</span>  static void endFileLease(DFSClient client, long inodeId) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    LEASE_MANAGER.end(client, inodeId);<a name="line.569"></a>
 <span class="sourceLineNo">570</span>  }<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  static Status getStatus(PipelineAckProto ack) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return PIPELINE_ACK_STATUS_GETTER.get(ack);<a name="line.573"></a>
+<span class="sourceLineNo">572</span>  static DataChecksum createChecksum(DFSClient client) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return CHECKSUM_CREATER.createChecksum(client);<a name="line.573"></a>
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  private static void processWriteBlockResponse(Channel channel, DatanodeInfo dnInfo,<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      Promise&lt;Channel&gt; promise, int timeoutMs) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    channel.pipeline().addLast(new IdleStateHandler(timeoutMs, 0, 0, TimeUnit.MILLISECONDS),<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      new ProtobufVarint32FrameDecoder(),<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      new ProtobufDecoder(BlockOpResponseProto.getDefaultInstance()),<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      new SimpleChannelInboundHandler&lt;BlockOpResponseProto&gt;() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>        @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp)<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            throws Exception {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          Status pipelineStatus = resp.getStatus();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (PipelineAck.isRestartOOBStatus(pipelineStatus)) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            throw new IOException("datanode " + dnInfo + " is restarting");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink();<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          if (resp.getStatus() != Status.SUCCESS) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              throw new InvalidBlockTokenException("Got access token error" + ", status message "<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                  + resp.getMessage() + ", " + logInfo);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>              throw new IOException("Got error" + ", status=" + resp.getStatus().name()<a name="line.596"></a>
-<span class="sourceLineNo">597</span>                  + ", status message " + resp.getMessage() + ", " + logInfo);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          // success<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          ChannelPipeline p = ctx.pipeline();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          for (ChannelHandler handler; (handler = p.removeLast()) != null;) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            // do not remove all handlers because we may have wrap or unwrap handlers at the header<a name="line.603"></a>
-<span class="sourceLineNo">604</span>            // of pipeline.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (handler instanceof IdleStateHandler) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              break;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>          // Disable auto read here. Enable it after we setup the streaming pipeline in<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          // FanOutOneBLockAsyncDFSOutput.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          ctx.channel().config().setAutoRead(false);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>          promise.trySuccess(ctx.channel());<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>        @Override<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          promise.tryFailure(new IOException("connection to " + dnInfo + " is closed"));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>        @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>          if (evt instanceof IdleStateEvent &amp;&amp; ((IdleStateEvent) evt).state() == READER_IDLE) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            promise<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response"));<a name="line.624"></a>
-<span class="sourceLineNo">625</span>          } else {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            super.userEventTriggered(ctx, evt);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>        @Override<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          promise.tryFailure(cause);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      });<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  private static void requestWriteBlock(Channel channel, Enum&lt;?&gt; storageType,<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      OpWriteBlockProto.Builder writeBlockProtoBuilder) throws IOException {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    OpWriteBlockProto proto = STORAGE_TYPE_SETTER.set(writeBlockProtoBuilder, storageType).build();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    int protoLen = proto.getSerializedSize();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    ByteBuf buffer =<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        channel.alloc().buffer(3 + CodedOutputStream.computeRawVarint32Size(protoLen) + protoLen);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    buffer.writeShort(DataTransferProtocol.DATA_TRANSFER_VERSION);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    buffer.writeByte(Op.WRITE_BLOCK.code);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    proto.writeDelimitedTo(new ByteBufOutputStream(buffer));<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    channel.writeAndFlush(buffer);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>  private static void initialize(Configuration conf, Channel channel, DatanodeInfo dnInfo,<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Enum&lt;?&gt; storageType, OpWriteBlockProto.Builder writeBlockProtoBuilder, int timeoutMs,<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      DFSClient client, Token&lt;BlockTokenIdentifier&gt; accessToken, Promise&lt;Channel&gt; promise)<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      throws IOException {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    Promise&lt;Void&gt; saslPromise = channel.eventLoop().newPromise();<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    trySaslNegotiate(conf, channel, dnInfo, timeoutMs, client, accessToken, saslPromise);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    saslPromise.addListener(new FutureListener&lt;Void&gt;() {<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>      @Override<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      public void operationComplete(Future&lt;Void&gt; future) throws Exception {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>        if (future.isSuccess()) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>          // setup response processing pipeline first, then send request.<a name="line.660"></a>
-<span class="sourceLineNo">661</span>          processWriteBlockResponse(channel, dnInfo, promise, timeoutMs);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          requestWriteBlock(channel, storageType, writeBlockProtoBuilder);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>        } else {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          promise.tryFailure(future.cause());<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      }<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    });<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private static List&lt;Future&lt;Channel&gt;&gt; connectToDataNodes(Configuration conf,<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      DFSClient client, String clientName, LocatedBlock locatedBlock, long maxBytesRcvd,<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      long latestGS, BlockConstructionStage stage, DataChecksum summer,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      EventLoopGroup eventLoopGroup, Class&lt;? extends Channel&gt; channelClass) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    Enum&lt;?&gt;[] storageTypes = locatedBlock.getStorageTypes();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    DatanodeInfo[] datanodeInfos = locatedBlock.getLocations();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    boolean connectToDnViaHostname =<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        conf.getBoolean(DFS_CLIENT_USE_DN_HOSTNAME, DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    int timeoutMs = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    ExtendedBlock blockCopy = new ExtendedBlock(locatedBlock.getBlock());<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    blockCopy.setNumBytes(locatedBlock.getBlockSize());<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    ClientOperationHeaderProto header = ClientOperationHeaderProto.newBuilder()<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        .setBaseHeader(BaseHeaderProto.newBuilder().setBlock(PB_HELPER.convert(blockCopy))<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            .setToken(PB_HELPER.convert(locatedBlock.getBlockToken())))<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        .setClientName(clientName).build();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    ChecksumProto checksumProto = DataTransferProtoUtil.toProto(summer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    OpWriteBlockProto.Builder writeBlockProtoBuilder = OpWriteBlockProto.newBuilder()<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        .setHeader(header).setStage(OpWriteBlockProto.BlockConstructionStage.valueOf(stage.name()))<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .setPipelineSize(1).setMinBytesRcvd(locatedBlock.getBlock().getNumBytes())<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        .setMaxBytesRcvd(maxBytesRcvd).setLatestGenerationStamp(latestGS)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        .setRequestedChecksum(checksumProto)<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        .setCachingStrategy(CachingStrategyProto.newBuilder().setDropBehind(true).build());<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    List&lt;Future&lt;Channel&gt;&gt; futureList = new ArrayList&lt;&gt;(datanodeInfos.length);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    for (int i = 0; i &lt; datanodeInfos.length; i++) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      DatanodeInfo dnInfo = datanodeInfos[i];<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      Enum&lt;?&gt; storageType = storageTypes[i];<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      Promise&lt;Channel&gt; promise = eventLoopGroup.next().newPromise();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      futureList.add(promise);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      String dnAddr = dnInfo.getXferAddr(connectToDnViaHostname);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      new Bootstrap().group(eventLoopGroup).channel(channelClass)<a name="line.699"></a>
-<span class="sourceLineNo">700</span>          .option(CONNECT_TIMEOUT_MILLIS, timeoutMs).handler(new ChannelInitializer&lt;Channel&gt;() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>            @Override<a name="line.702"></a>
-<span class="sourceLineNo">703</span>            protected void initChannel(Channel ch) throws Exception {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>              // we need to get the remote address of the channel so we can only 

<TRUNCATED>