You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/10/17 14:53:22 UTC

[01/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 6129abc29 -> 713132a3d


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.BlockReaderWrapper.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.BlockReaderWrapper.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.BlockReaderWrapper.html
index c491776..76a9ecc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.BlockReaderWrapper.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.BlockReaderWrapper.html
@@ -210,7 +210,7 @@
 <span class="sourceLineNo">202</span><a name="line.202"></a>
 <span class="sourceLineNo">203</span>  private void readIndex(boolean useTags) throws IOException {<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    long fileSize = fs.getFileStatus(path).getLen();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    LOG.info("Size of " + path + ": " + fileSize);<a name="line.205"></a>
+<span class="sourceLineNo">205</span>    LOG.info("Size of {}: {} compression={}", path, fileSize, compr.toString());<a name="line.205"></a>
 <span class="sourceLineNo">206</span><a name="line.206"></a>
 <span class="sourceLineNo">207</span>    FSDataInputStream istream = fs.open(path);<a name="line.207"></a>
 <span class="sourceLineNo">208</span>    HFileContext meta = new HFileContextBuilder()<a name="line.208"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.html
index c491776..76a9ecc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.html
@@ -210,7 +210,7 @@
 <span class="sourceLineNo">202</span><a name="line.202"></a>
 <span class="sourceLineNo">203</span>  private void readIndex(boolean useTags) throws IOException {<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    long fileSize = fs.getFileStatus(path).getLen();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    LOG.info("Size of " + path + ": " + fileSize);<a name="line.205"></a>
+<span class="sourceLineNo">205</span>    LOG.info("Size of {}: {} compression={}", path, fileSize, compr.toString());<a name="line.205"></a>
 <span class="sourceLineNo">206</span><a name="line.206"></a>
 <span class="sourceLineNo">207</span>    FSDataInputStream istream = fs.open(path);<a name="line.207"></a>
 <span class="sourceLineNo">208</span>    HFileContext meta = new HFileContextBuilder()<a name="line.208"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html
index 1f24659..4b46b23 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html
@@ -240,7 +240,7 @@
 <span class="sourceLineNo">232</span><a name="line.232"></a>
 <span class="sourceLineNo">233</span>    Path storeFilePath = sfw.getPath();<a name="line.233"></a>
 <span class="sourceLineNo">234</span>    long fileSize = fs.getFileStatus(storeFilePath).getLen();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    LOG.info("Created " + storeFilePath + ", " + fileSize + " bytes");<a name="line.235"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Created {}, {} bytes, compression={}", storeFilePath, fileSize, compr.toString());<a name="line.235"></a>
 <span class="sourceLineNo">236</span><a name="line.236"></a>
 <span class="sourceLineNo">237</span>    return true;<a name="line.237"></a>
 <span class="sourceLineNo">238</span>  }<a name="line.238"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html
index e2b18bd..b18632e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html
@@ -43,231 +43,233 @@
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Table;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.util.ToolRunner;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.log4j.Appender;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.log4j.LogManager;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.log4j.spi.LoggingEvent;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.junit.After;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.junit.Before;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.junit.ClassRule;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.junit.Ignore;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.junit.Rule;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.junit.Test;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.junit.experimental.categories.Category;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.junit.rules.TestName;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.junit.runner.RunWith;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.mockito.ArgumentMatcher;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.mockito.Mock;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.mockito.runners.MockitoJUnitRunner;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterables;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>@RunWith(MockitoJUnitRunner.class)<a name="line.60"></a>
-<span class="sourceLineNo">061</span>@Category({MediumTests.class})<a name="line.61"></a>
-<span class="sourceLineNo">062</span>public class TestCanaryTool {<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  @ClassRule<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      HBaseClassTestRule.forClass(TestCanaryTool.class);<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private HBaseTestingUtility testingUtility;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private static final byte[] FAMILY = Bytes.toBytes("f");<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private static final byte[] COLUMN = Bytes.toBytes("col");<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>  @Before<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  public void setUp() throws Exception {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    testingUtility = new HBaseTestingUtility();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    testingUtility.startMiniCluster();<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    LogManager.getRootLogger().addAppender(mockAppender);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  @After<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  public void tearDown() throws Exception {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    testingUtility.shutdownMiniCluster();<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    LogManager.getRootLogger().removeAppender(mockAppender);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  }<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @Mock<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  Appender mockAppender;<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  @Test<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  public void testBasicZookeeperCanaryWorks() throws Exception {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    final String[] args = { "-t", "10000", "-zookeeper" };<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    testZookeeperCanaryWithArgs(args);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testZookeeperCanaryPermittedFailuresArgumentWorks() throws Exception {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    final String[] args = { "-t", "10000", "-zookeeper", "-treatFailureAsError", "-permittedZookeeperFailures", "1" };<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    testZookeeperCanaryWithArgs(args);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  @Test<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public void testBasicCanaryWorks() throws Exception {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    Table table = testingUtility.createTable(tableName, new byte[][] { FAMILY });<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    // insert some test rows<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    for (int i=0; i&lt;1000; i++) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      Put p = new Put(iBytes);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      p.addColumn(FAMILY, COLUMN, iBytes);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      table.put(p);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    }<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    Canary canary = new Canary(executor, sink);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    String[] args = { "-writeSniffing", "-t", "10000", name.getMethodName() };<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assertEquals("verify no read error count", 0, canary.getReadFailures().size());<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    assertEquals("verify no write error count", 0, canary.getWriteFailures().size());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    verify(sink, atLeastOnce()).publishReadTiming(isA(ServerName.class), isA(HRegionInfo.class),<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      isA(ColumnFamilyDescriptor.class), anyLong());<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  @Test<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  @Ignore("Intermittent argument matching failures, see HBASE-18813")<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public void testReadTableTimeouts() throws Exception {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    final TableName [] tableNames = new TableName[2];<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    tableNames[0] = TableName.valueOf(name.getMethodName() + "1");<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    tableNames[1] = TableName.valueOf(name.getMethodName() + "2");<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    // Create 2 test tables.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    for (int j = 0; j&lt;2; j++) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      Table table = testingUtility.createTable(tableNames[j], new byte[][] { FAMILY });<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      // insert some test rows<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      for (int i=0; i&lt;1000; i++) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        byte[] iBytes = Bytes.toBytes(i + j);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        Put p = new Put(iBytes);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        p.addColumn(FAMILY, COLUMN, iBytes);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        table.put(p);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      }<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    Canary canary = new Canary(executor, sink);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    String configuredTimeoutStr = tableNames[0].getNameAsString() + "=" + Long.MAX_VALUE + "," +<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      tableNames[1].getNameAsString() + "=0";<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    String[] args = { "-readTableTimeouts", configuredTimeoutStr, name.getMethodName() + "1", name.getMethodName() + "2"};<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    verify(sink, times(tableNames.length)).initializeAndGetReadLatencyForTable(isA(String.class));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    for (int i=0; i&lt;2; i++) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      assertNotEquals("verify non-null read latency", null, sink.getReadLatencyMap().get(tableNames[i].getNameAsString()));<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      assertNotEquals("verify non-zero read latency", 0L, sink.getReadLatencyMap().get(tableNames[i].getNameAsString()));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    // One table's timeout is set for 0 ms and thus, should lead to an error.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    verify(mockAppender, times(1)).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      public boolean matches(LoggingEvent argument) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        return ((LoggingEvent) argument).getRenderedMessage().contains("exceeded the configured read timeout.");<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }));<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    verify(mockAppender, times(2)).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      public boolean matches(LoggingEvent argument) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        return argument.getRenderedMessage().contains("The configured read timeout was");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }));<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  @Ignore("Intermittent argument matching failures, see HBASE-18813")<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  public void testWriteTableTimeout() throws Exception {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Canary canary = new Canary(executor, sink);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    String[] args = { "-writeSniffing", "-writeTableTimeout", String.valueOf(Long.MAX_VALUE)};<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertNotEquals("verify non-null write latency", null, sink.getWriteLatency());<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertNotEquals("verify non-zero write latency", 0L, sink.getWriteLatency());<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    verify(mockAppender, times(1)).doAppend(argThat(<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          @Override<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          public boolean matches(LoggingEvent argument) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            return argument.getRenderedMessage().contains("The configured write timeout was");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          }<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>  //no table created, so there should be no regions<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  @Test<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  public void testRegionserverNoRegions() throws Exception {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    runRegionserverCanary();<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    verify(mockAppender).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      public boolean matches(LoggingEvent argument) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>        return argument.getRenderedMessage().contains("Regionserver not serving any regions");<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>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  //by creating a table, there shouldn't be any region servers not serving any regions<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  @Test<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public void testRegionserverWithRegions() throws Exception {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    testingUtility.createTable(tableName, new byte[][] { FAMILY });<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    runRegionserverCanary();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    verify(mockAppender, never()).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      @Override<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      public boolean matches(LoggingEvent argument) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        return argument.getRenderedMessage().contains("Regionserver not serving any regions");<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">214</span>  @Test<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  public void testRawScanConfig() throws Exception {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Table table = testingUtility.createTable(tableName, new byte[][] { FAMILY });<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // insert some test rows<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    for (int i=0; i&lt;1000; i++) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      Put p = new Put(iBytes);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      p.addColumn(FAMILY, COLUMN, iBytes);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      table.put(p);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    Canary canary = new Canary(executor, sink);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    String[] args = { "-t", "10000", name.getMethodName() };<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    org.apache.hadoop.conf.Configuration conf =<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      new org.apache.hadoop.conf.Configuration(testingUtility.getConfiguration());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    conf.setBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, true);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    assertEquals(0, ToolRunner.run(conf, canary, args));<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    verify(sink, atLeastOnce())<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        .publishReadTiming(isA(ServerName.class), isA(HRegionInfo.class),<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        isA(ColumnFamilyDescriptor.class), anyLong());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    assertEquals("verify no read error count", 0, canary.getReadFailures().size());<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>  private void runRegionserverCanary() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Canary canary = new Canary(executor, new Canary.RegionServerStdOutSink());<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    String[] args = { "-t", "10000", "-regionserver"};<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    assertEquals("verify no read error count", 0, canary.getReadFailures().size());<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  private void testZookeeperCanaryWithArgs(String[] args) throws Exception {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Integer port =<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Iterables.getOnlyElement(testingUtility.getZkCluster().getClientPortList(), null);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    testingUtility.getConfiguration().set(HConstants.ZOOKEEPER_QUORUM,<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      "localhost:" + port + "/hbase");<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(2);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    Canary.ZookeeperStdOutSink sink = spy(new Canary.ZookeeperStdOutSink());<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    Canary canary = new Canary(executor, sink);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    String baseZnode = testingUtility.getConfiguration()<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      .get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    verify(sink, atLeastOnce())<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      .publishReadTiming(eq(baseZnode), eq("localhost:" + port), anyLong());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>}<a name="line.262"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.util.ToolRunner;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.log4j.Appender;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.log4j.LogManager;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.log4j.spi.LoggingEvent;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.After;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.junit.Before;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.junit.ClassRule;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.Ignore;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.junit.Rule;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.junit.Test;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.experimental.categories.Category;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.rules.TestName;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.runner.RunWith;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.mockito.ArgumentMatcher;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.mockito.Mock;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.mockito.runners.MockitoJUnitRunner;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hbase.thirdparty.com.google.common.collect.Iterables;<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>@RunWith(MockitoJUnitRunner.class)<a name="line.61"></a>
+<span class="sourceLineNo">062</span>@Category({MediumTests.class})<a name="line.62"></a>
+<span class="sourceLineNo">063</span>public class TestCanaryTool {<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  @ClassRule<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      HBaseClassTestRule.forClass(TestCanaryTool.class);<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private HBaseTestingUtility testingUtility;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final byte[] FAMILY = Bytes.toBytes("f");<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private static final byte[] COLUMN = Bytes.toBytes("col");<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  @Rule<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  public TestName name = new TestName();<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  @Before<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  public void setUp() throws Exception {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    testingUtility = new HBaseTestingUtility();<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    testingUtility.startMiniCluster();<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    LogManager.getRootLogger().addAppender(mockAppender);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  @After<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public void tearDown() throws Exception {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    testingUtility.shutdownMiniCluster();<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    LogManager.getRootLogger().removeAppender(mockAppender);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @Mock<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  Appender mockAppender;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  @Test<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  public void testBasicZookeeperCanaryWorks() throws Exception {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    final String[] args = { "-t", "10000", "-zookeeper" };<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    testZookeeperCanaryWithArgs(args);<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>  @Test<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void testZookeeperCanaryPermittedFailuresArgumentWorks() throws Exception {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    final String[] args = { "-t", "10000", "-zookeeper", "-treatFailureAsError", "-permittedZookeeperFailures", "1" };<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    testZookeeperCanaryWithArgs(args);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @Test<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public void testBasicCanaryWorks() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    Table table = testingUtility.createTable(tableName, new byte[][] { FAMILY });<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    // insert some test rows<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    for (int i=0; i&lt;1000; i++) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      Put p = new Put(iBytes);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      p.addColumn(FAMILY, COLUMN, iBytes);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      table.put(p);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    Canary canary = new Canary(executor, sink);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    String[] args = { "-writeSniffing", "-t", "10000", tableName.getNameAsString() };<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    assertEquals("verify no read error count", 0, canary.getReadFailures().size());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    assertEquals("verify no write error count", 0, canary.getWriteFailures().size());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    verify(sink, atLeastOnce()).publishReadTiming(isA(ServerName.class), isA(RegionInfo.class),<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      isA(ColumnFamilyDescriptor.class), anyLong());<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>  @Test<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  @Ignore("Intermittent argument matching failures, see HBASE-18813")<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public void testReadTableTimeouts() throws Exception {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    final TableName [] tableNames = new TableName[2];<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    tableNames[0] = TableName.valueOf(name.getMethodName() + "1");<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    tableNames[1] = TableName.valueOf(name.getMethodName() + "2");<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    // Create 2 test tables.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (int j = 0; j&lt;2; j++) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      Table table = testingUtility.createTable(tableNames[j], new byte[][] { FAMILY });<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      // insert some test rows<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      for (int i=0; i&lt;1000; i++) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        byte[] iBytes = Bytes.toBytes(i + j);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        Put p = new Put(iBytes);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        p.addColumn(FAMILY, COLUMN, iBytes);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        table.put(p);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    Canary canary = new Canary(executor, sink);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    String configuredTimeoutStr = tableNames[0].getNameAsString() + "=" + Long.MAX_VALUE + "," +<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      tableNames[1].getNameAsString() + "=0";<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    String[] args = {"-readTableTimeouts", configuredTimeoutStr, name.getMethodName() + "1",<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      name.getMethodName() + "2"};<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    verify(sink, times(tableNames.length)).initializeAndGetReadLatencyForTable(isA(String.class));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    for (int i=0; i&lt;2; i++) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      assertNotEquals("verify non-null read latency", null, sink.getReadLatencyMap().get(tableNames[i].getNameAsString()));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      assertNotEquals("verify non-zero read latency", 0L, sink.getReadLatencyMap().get(tableNames[i].getNameAsString()));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    // One table's timeout is set for 0 ms and thus, should lead to an error.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    verify(mockAppender, times(1)).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      @Override<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      public boolean matches(LoggingEvent argument) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        return ((LoggingEvent) argument).getRenderedMessage().contains("exceeded the configured read timeout.");<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    }));<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    verify(mockAppender, times(2)).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      @Override<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      public boolean matches(LoggingEvent argument) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        return argument.getRenderedMessage().contains("The configured read timeout was");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }));<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  @Ignore("Intermittent argument matching failures, see HBASE-18813")<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public void testWriteTableTimeout() throws Exception {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    Canary canary = new Canary(executor, sink);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    String[] args = { "-writeSniffing", "-writeTableTimeout", String.valueOf(Long.MAX_VALUE)};<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    assertNotEquals("verify non-null write latency", null, sink.getWriteLatency());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    assertNotEquals("verify non-zero write latency", 0L, sink.getWriteLatency());<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    verify(mockAppender, times(1)).doAppend(argThat(<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          @Override<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          public boolean matches(LoggingEvent argument) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>            return argument.getRenderedMessage().contains("The configured write timeout was");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        }));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  //no table created, so there should be no regions<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  @Test<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  public void testRegionserverNoRegions() throws Exception {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    runRegionserverCanary();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    verify(mockAppender).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      public boolean matches(LoggingEvent argument) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        return argument.getRenderedMessage().contains("Regionserver not serving any regions");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  //by creating a table, there shouldn't be any region servers not serving any regions<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  @Test<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public void testRegionserverWithRegions() throws Exception {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    testingUtility.createTable(tableName, new byte[][] { FAMILY });<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    runRegionserverCanary();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    verify(mockAppender, never()).doAppend(argThat(new ArgumentMatcher&lt;LoggingEvent&gt;() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      @Override<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      public boolean matches(LoggingEvent argument) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        return argument.getRenderedMessage().contains("Regionserver not serving any regions");<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  @Test<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public void testRawScanConfig() throws Exception {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    Table table = testingUtility.createTable(tableName, new byte[][] { FAMILY });<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // insert some test rows<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    for (int i=0; i&lt;1000; i++) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      Put p = new Put(iBytes);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      p.addColumn(FAMILY, COLUMN, iBytes);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      table.put(p);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    Canary.RegionStdOutSink sink = spy(new Canary.RegionStdOutSink());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    Canary canary = new Canary(executor, sink);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    String[] args = { "-t", "10000", name.getMethodName() };<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    org.apache.hadoop.conf.Configuration conf =<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      new org.apache.hadoop.conf.Configuration(testingUtility.getConfiguration());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    conf.setBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, true);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    assertEquals(0, ToolRunner.run(conf, canary, args));<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    verify(sink, atLeastOnce())<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        .publishReadTiming(isA(ServerName.class), isA(RegionInfo.class),<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        isA(ColumnFamilyDescriptor.class), anyLong());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    assertEquals("verify no read error count", 0, canary.getReadFailures().size());<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 void runRegionserverCanary() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(1);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Canary canary = new Canary(executor, new Canary.RegionServerStdOutSink());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    String[] args = { "-t", "10000", "-regionserver"};<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    assertEquals("verify no read error count", 0, canary.getReadFailures().size());<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  private void testZookeeperCanaryWithArgs(String[] args) throws Exception {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    Integer port =<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      Iterables.getOnlyElement(testingUtility.getZkCluster().getClientPortList(), null);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    testingUtility.getConfiguration().set(HConstants.ZOOKEEPER_QUORUM,<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      "localhost:" + port + "/hbase");<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(2);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    Canary.ZookeeperStdOutSink sink = spy(new Canary.ZookeeperStdOutSink());<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    Canary canary = new Canary(executor, sink);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    assertEquals(0, ToolRunner.run(testingUtility.getConfiguration(), canary, args));<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span>    String baseZnode = testingUtility.getConfiguration()<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      .get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    verify(sink, atLeastOnce())<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      .publishReadTiming(eq(baseZnode), eq("localhost:" + port), anyLong());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>}<a name="line.264"></a>
 
 
 


[21/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
index c2698b3..9142fe1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
@@ -207,307 +207,309 @@
 <span class="sourceLineNo">199</span>      }<a name="line.199"></a>
 <span class="sourceLineNo">200</span>      tmp = fileInfo.get(TIMERANGE_KEY);<a name="line.200"></a>
 <span class="sourceLineNo">201</span>      fd.latestPutTs = tmp == null ? HConstants.LATEST_TIMESTAMP: TimeRangeTracker.parseFrom(tmp).getMax();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, encoding={}, seqNum={}{}",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          keyCount,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          r.getBloomFilterType().toString(),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          seqNum,<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return fd;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * Creates file scanners for compaction.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param filesToCompact Files.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @return Scanners.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      smallestReadPoint);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private long getSmallestReadPoint() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return store.getSmallestReadPoint();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected interface InternalScannerFactory {<a name="line.229"></a>
+<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, "<a name="line.202"></a>
+<span class="sourceLineNo">203</span>              + "encoding={}, compression={}, seqNum={}{}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          keyCount,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          r.getBloomFilterType().toString(),<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          compactionCompression,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          seqNum,<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return fd;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * Creates file scanners for compaction.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @param filesToCompact Files.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return Scanners.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      smallestReadPoint);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private long getSmallestReadPoint() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return store.getSmallestReadPoint();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
 <span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.231"></a>
+<span class="sourceLineNo">231</span>  protected interface InternalScannerFactory {<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.237"></a>
+<span class="sourceLineNo">233</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>    @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        fd.earliestPutTs);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  };<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Creates a writer for a new file in a temporary directory.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param fd The file details.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @throws IOException if creation failed<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      User user) throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    if (store.getCoprocessorHost() == null) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return store.getScanInfo();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      request, user);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  /**<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param request Compaction request.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param scanType Scan type.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param scanner The default scanner created for compaction.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InternalScanner scanner, User user) throws IOException {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    if (store.getCoprocessorHost() == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      return scanner;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      request, user);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>    // Find the smallest read point across all the Scanners.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    T writer = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    boolean dropCache;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      dropCache = this.dropCacheMajor;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMinor;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    List&lt;StoreFileScanner&gt; scanners =<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    InternalScanner scanner = null;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    boolean finished = false;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      boolean cleanSeqId = false;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        cleanSeqId = true;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (!finished) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    } finally {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Closeables.close(scanner, true);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (!finished &amp;&amp; writer != null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        abortWriter(writer);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assert finished : "We should have exited the method on all error paths";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return commitWriter(writer, fd, request);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      CompactionRequestImpl request) throws IOException;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.345"></a>
+<span class="sourceLineNo">239</span>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>    @Override<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    @Override<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        fd.earliestPutTs);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  };<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>  /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * Creates a writer for a new file in a temporary directory.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @param fd The file details.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @throws IOException if creation failed<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throws IOException {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      User user) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (store.getCoprocessorHost() == null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      return store.getScanInfo();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      request, user);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  /**<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param request Compaction request.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param scanType Scan type.<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @param scanner The default scanner created for compaction.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      InternalScanner scanner, User user) throws IOException {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    if (store.getCoprocessorHost() == null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      return scanner;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      request, user);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    // Find the smallest read point across all the Scanners.<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    T writer = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    boolean dropCache;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMajor;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      dropCache = this.dropCacheMinor;<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>    List&lt;StoreFileScanner&gt; scanners =<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    InternalScanner scanner = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    boolean finished = false;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      boolean cleanSeqId = false;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        cleanSeqId = true;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (!finished) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.330"></a>
+<span class="sourceLineNo">331</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } finally {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      Closeables.close(scanner, true);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      if (!finished &amp;&amp; writer != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        abortWriter(writer);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    assert finished : "We should have exited the method on all error paths";<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return commitWriter(writer, fd, request);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      CompactionRequestImpl request) throws IOException;<a name="line.345"></a>
 <span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Performs the compaction.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * @param fd FileDetails of cell sink writer<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param scanner Where to read from.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param writer Where to write to.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param smallestReadPoint Smallest read point.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *          smallestReadPoint<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param major Is a major compaction.<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param numofFilesToCompact the number of files to compact<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assert writer instanceof ShipperListener;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    long bytesWrittenProgressForLog = 0;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // we have to use a do/while loop.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    long lastMillis = 0;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (LOG.isDebugEnabled()) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    long now = 0;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    boolean hasMore;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    ScannerContext scannerContext =<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>    throughputController.start(compactionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      do {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        if (LOG.isDebugEnabled()) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // output to writer:<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        Cell lastCleanCell = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        long lastCleanCellSeqId = 0;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        for (Cell c : cells) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            lastCleanCell = c;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          } else {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            lastCleanCell = null;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            lastCleanCellSeqId = 0;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          writer.append(c);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          int len = KeyValueUtil.length(c);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          ++progress.currentCompactedKVs;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          progress.totalCompactedSize += len;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          bytesWrittenProgressForShippedCall += len;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (LOG.isDebugEnabled()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            bytesWrittenProgressForLog += len;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          throughputController.control(compactionName, len);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          // check periodically to see if a system stop is requested<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              if (!store.areWritesEnabled()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                progress.cancel();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                return false;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>              }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            if (lastCleanCell != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.423"></a>
-<span class="sourceLineNo">424</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.424"></a>
-<span class="sourceLineNo">425</span>              // sequence id before ShipperListener.beforeShipped<a name="line.425"></a>
-<span class="sourceLineNo">426</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            // if they are holding any.<a name="line.429"></a>
-<span class="sourceLineNo">430</span>            ((ShipperListener)writer).beforeShipped();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.435"></a>
-<span class="sourceLineNo">436</span>            // may clear prevBlocks list.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>            kvs.shipped();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        // Log the progress of long running compactions every minute if<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        // logging at DEBUG level<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        if (LOG.isDebugEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug("Compaction progress: "<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                + compactionName<a name="line.450"></a>
-<span class="sourceLineNo">451</span>                + " "<a name="line.451"></a>
-<span class="sourceLineNo">452</span>                + progress<a name="line.452"></a>
-<span class="sourceLineNo">453</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.454"></a>
-<span class="sourceLineNo">455</span>                + throughputController);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            lastMillis = now;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } while (hasMore);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    } catch (InterruptedException e) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      progress.cancel();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          + compactionName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    } finally {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      throughputController.finish(compactionName);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    progress.complete();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return true;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  /**<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * @param store store<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * @param scanners Store file scanners.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * @param scanType Scan type.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param earliestPutTs Earliest put across all files.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return A compaction scanner.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      long earliestPutTs) throws IOException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @param store The store.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * @param scanners Store file scanners.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * @param earliestPutTs Earliest put across all files.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @return A compaction scanner.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        dropDeletesFromRow, dropDeletesToRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>}<a name="line.502"></a>
+<span class="sourceLineNo">347</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Performs the compaction.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * @param fd FileDetails of cell sink writer<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * @param scanner Where to read from.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param writer Where to write to.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @param smallestReadPoint Smallest read point.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   *          smallestReadPoint<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @param major Is a major compaction.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param numofFilesToCompact the number of files to compact<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    assert writer instanceof ShipperListener;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    long bytesWrittenProgressForLog = 0;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    // we have to use a do/while loop.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    long lastMillis = 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (LOG.isDebugEnabled()) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    long now = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    boolean hasMore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    ScannerContext scannerContext =<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    throughputController.start(compactionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      do {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        if (LOG.isDebugEnabled()) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        // output to writer:<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        Cell lastCleanCell = null;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        long lastCleanCellSeqId = 0;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        for (Cell c : cells) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>            lastCleanCell = c;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          } else {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            lastCleanCell = null;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            lastCleanCellSeqId = 0;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          writer.append(c);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          int len = KeyValueUtil.length(c);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ++progress.currentCompactedKVs;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          progress.totalCompactedSize += len;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          bytesWrittenProgressForShippedCall += len;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (LOG.isDebugEnabled()) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            bytesWrittenProgressForLog += len;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          throughputController.control(compactionName, len);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          // check periodically to see if a system stop is requested<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>              if (!store.areWritesEnabled()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                progress.cancel();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                return false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>              }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>            if (lastCleanCell != null) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.426"></a>
+<span class="sourceLineNo">427</span>              // sequence id before ShipperListener.beforeShipped<a name="line.427"></a>
+<span class="sourceLineNo">428</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.430"></a>
+<span class="sourceLineNo">431</span>            // if they are holding any.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>            ((ShipperListener)writer).beforeShipped();<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.433"></a>
+<span class="sourceLineNo">434</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.434"></a>
+<span class="sourceLineNo">435</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            // may clear prevBlocks list.<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            kvs.shipped();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        // Log the progress of long running compactions every minute if<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        // logging at DEBUG level<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        if (LOG.isDebugEnabled()) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            LOG.debug("Compaction progress: "<a name="line.451"></a>
+<span class="sourceLineNo">452</span>                + compactionName<a name="line.452"></a>
+<span class="sourceLineNo">453</span>                + " "<a name="line.453"></a>
+<span class="sourceLineNo">454</span>                + progress<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.456"></a>
+<span class="sourceLineNo">457</span>                + throughputController);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            lastMillis = now;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      } while (hasMore);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } catch (InterruptedException e) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      progress.cancel();<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          + compactionName);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    } finally {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throughputController.finish(compactionName);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    progress.complete();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>  /**<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @param store store<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @param scanners Store file scanners.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * @param scanType Scan type.<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @param earliestPutTs Earliest put across all files.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return A compaction scanner.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      long earliestPutTs) throws IOException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param store The store.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @param scanners Store file scanners.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @param earliestPutTs Earliest put across all files.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * @return A compaction scanner.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        dropDeletesFromRow, dropDeletesToRow);<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>
 
 
 


[23/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.CellSinkFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.CellSinkFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.CellSinkFactory.html
index c2698b3..9142fe1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.CellSinkFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.CellSinkFactory.html
@@ -207,307 +207,309 @@
 <span class="sourceLineNo">199</span>      }<a name="line.199"></a>
 <span class="sourceLineNo">200</span>      tmp = fileInfo.get(TIMERANGE_KEY);<a name="line.200"></a>
 <span class="sourceLineNo">201</span>      fd.latestPutTs = tmp == null ? HConstants.LATEST_TIMESTAMP: TimeRangeTracker.parseFrom(tmp).getMax();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, encoding={}, seqNum={}{}",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          keyCount,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          r.getBloomFilterType().toString(),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          seqNum,<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return fd;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * Creates file scanners for compaction.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param filesToCompact Files.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @return Scanners.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      smallestReadPoint);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private long getSmallestReadPoint() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return store.getSmallestReadPoint();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected interface InternalScannerFactory {<a name="line.229"></a>
+<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, "<a name="line.202"></a>
+<span class="sourceLineNo">203</span>              + "encoding={}, compression={}, seqNum={}{}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          keyCount,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          r.getBloomFilterType().toString(),<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          compactionCompression,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          seqNum,<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return fd;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * Creates file scanners for compaction.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @param filesToCompact Files.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return Scanners.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      smallestReadPoint);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private long getSmallestReadPoint() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return store.getSmallestReadPoint();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
 <span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.231"></a>
+<span class="sourceLineNo">231</span>  protected interface InternalScannerFactory {<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.237"></a>
+<span class="sourceLineNo">233</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>    @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        fd.earliestPutTs);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  };<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Creates a writer for a new file in a temporary directory.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param fd The file details.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @throws IOException if creation failed<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      User user) throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    if (store.getCoprocessorHost() == null) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return store.getScanInfo();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      request, user);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  /**<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param request Compaction request.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param scanType Scan type.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param scanner The default scanner created for compaction.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InternalScanner scanner, User user) throws IOException {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    if (store.getCoprocessorHost() == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      return scanner;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      request, user);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>    // Find the smallest read point across all the Scanners.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    T writer = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    boolean dropCache;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      dropCache = this.dropCacheMajor;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMinor;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    List&lt;StoreFileScanner&gt; scanners =<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    InternalScanner scanner = null;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    boolean finished = false;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      boolean cleanSeqId = false;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        cleanSeqId = true;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (!finished) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    } finally {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Closeables.close(scanner, true);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (!finished &amp;&amp; writer != null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        abortWriter(writer);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assert finished : "We should have exited the method on all error paths";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return commitWriter(writer, fd, request);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      CompactionRequestImpl request) throws IOException;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.345"></a>
+<span class="sourceLineNo">239</span>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>    @Override<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    @Override<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        fd.earliestPutTs);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  };<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>  /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * Creates a writer for a new file in a temporary directory.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @param fd The file details.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @throws IOException if creation failed<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throws IOException {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      User user) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (store.getCoprocessorHost() == null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      return store.getScanInfo();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      request, user);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  /**<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param request Compaction request.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param scanType Scan type.<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @param scanner The default scanner created for compaction.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      InternalScanner scanner, User user) throws IOException {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    if (store.getCoprocessorHost() == null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      return scanner;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      request, user);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    // Find the smallest read point across all the Scanners.<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    T writer = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    boolean dropCache;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMajor;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      dropCache = this.dropCacheMinor;<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>    List&lt;StoreFileScanner&gt; scanners =<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    InternalScanner scanner = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    boolean finished = false;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      boolean cleanSeqId = false;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        cleanSeqId = true;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (!finished) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.330"></a>
+<span class="sourceLineNo">331</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } finally {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      Closeables.close(scanner, true);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      if (!finished &amp;&amp; writer != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        abortWriter(writer);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    assert finished : "We should have exited the method on all error paths";<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return commitWriter(writer, fd, request);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      CompactionRequestImpl request) throws IOException;<a name="line.345"></a>
 <span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Performs the compaction.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * @param fd FileDetails of cell sink writer<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param scanner Where to read from.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param writer Where to write to.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param smallestReadPoint Smallest read point.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *          smallestReadPoint<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param major Is a major compaction.<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param numofFilesToCompact the number of files to compact<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assert writer instanceof ShipperListener;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    long bytesWrittenProgressForLog = 0;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // we have to use a do/while loop.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    long lastMillis = 0;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (LOG.isDebugEnabled()) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    long now = 0;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    boolean hasMore;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    ScannerContext scannerContext =<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>    throughputController.start(compactionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      do {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        if (LOG.isDebugEnabled()) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // output to writer:<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        Cell lastCleanCell = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        long lastCleanCellSeqId = 0;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        for (Cell c : cells) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            lastCleanCell = c;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          } else {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            lastCleanCell = null;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            lastCleanCellSeqId = 0;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          writer.append(c);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          int len = KeyValueUtil.length(c);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          ++progress.currentCompactedKVs;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          progress.totalCompactedSize += len;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          bytesWrittenProgressForShippedCall += len;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (LOG.isDebugEnabled()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            bytesWrittenProgressForLog += len;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          throughputController.control(compactionName, len);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          // check periodically to see if a system stop is requested<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              if (!store.areWritesEnabled()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                progress.cancel();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                return false;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>              }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            if (lastCleanCell != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.423"></a>
-<span class="sourceLineNo">424</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.424"></a>
-<span class="sourceLineNo">425</span>              // sequence id before ShipperListener.beforeShipped<a name="line.425"></a>
-<span class="sourceLineNo">426</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            // if they are holding any.<a name="line.429"></a>
-<span class="sourceLineNo">430</span>            ((ShipperListener)writer).beforeShipped();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.435"></a>
-<span class="sourceLineNo">436</span>            // may clear prevBlocks list.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>            kvs.shipped();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        // Log the progress of long running compactions every minute if<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        // logging at DEBUG level<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        if (LOG.isDebugEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug("Compaction progress: "<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                + compactionName<a name="line.450"></a>
-<span class="sourceLineNo">451</span>                + " "<a name="line.451"></a>
-<span class="sourceLineNo">452</span>                + progress<a name="line.452"></a>
-<span class="sourceLineNo">453</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.454"></a>
-<span class="sourceLineNo">455</span>                + throughputController);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            lastMillis = now;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } while (hasMore);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    } catch (InterruptedException e) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      progress.cancel();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          + compactionName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    } finally {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      throughputController.finish(compactionName);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    progress.complete();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return true;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  /**<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * @param store store<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * @param scanners Store file scanners.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * @param scanType Scan type.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param earliestPutTs Earliest put across all files.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return A compaction scanner.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      long earliestPutTs) throws IOException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @param store The store.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * @param scanners Store file scanners.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * @param earliestPutTs Earliest put across all files.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @return A compaction scanner.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        dropDeletesFromRow, dropDeletesToRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>}<a name="line.502"></a>
+<span class="sourceLineNo">347</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Performs the compaction.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * @param fd FileDetails of cell sink writer<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * @param scanner Where to read from.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param writer Where to write to.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @param smallestReadPoint Smallest read point.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   *          smallestReadPoint<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @param major Is a major compaction.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param numofFilesToCompact the number of files to compact<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    assert writer instanceof ShipperListener;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    long bytesWrittenProgressForLog = 0;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    // we have to use a do/while loop.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    long lastMillis = 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (LOG.isDebugEnabled()) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    long now = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    boolean hasMore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    ScannerContext scannerContext =<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    throughputController.start(compactionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      do {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        if (LOG.isDebugEnabled()) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        // output to writer:<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        Cell lastCleanCell = null;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        long lastCleanCellSeqId = 0;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        for (Cell c : cells) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>            lastCleanCell = c;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          } else {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            lastCleanCell = null;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            lastCleanCellSeqId = 0;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          writer.append(c);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          int len = KeyValueUtil.length(c);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ++progress.currentCompactedKVs;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          progress.totalCompactedSize += len;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          bytesWrittenProgressForShippedCall += len;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (LOG.isDebugEnabled()) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            bytesWrittenProgressForLog += len;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          throughputController.control(compactionName, len);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          // check periodically to see if a system stop is requested<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>              if (!store.areWritesEnabled()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                progress.cancel();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                return false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>              }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>            if (lastCleanCell != null) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.426"></a>
+<span class="sourceLineNo">427</span>              // sequence id before ShipperListener.beforeShipped<a name="line.427"></a>
+<span class="sourceLineNo">428</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.430"></a>
+<span class="sourceLineNo">431</span>            // if they are holding any.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>            ((ShipperListener)writer).beforeShipped();<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.433"></a>
+<span class="sourceLineNo">434</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.434"></a>
+<span class="sourceLineNo">435</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            // may clear prevBlocks list.<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            kvs.shipped();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        // Log the progress of long running compactions every minute if<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        // logging at DEBUG level<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        if (LOG.isDebugEnabled()) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            LOG.debug("Compaction progress: "<a name="line.451"></a>
+<span class="sourceLineNo">452</span>                + compactionName<a name="line.452"></a>
+<span class="sourceLineNo">453</span>                + " "<a name="line.453"></a>
+<span class="sourceLineNo">454</span>                + progress<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.456"></a>
+<span class="sourceLineNo">457</span>                + throughputController);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            lastMillis = now;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      } while (hasMore);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } catch (InterruptedException e) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      progress.cancel();<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          + compactionName);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    } finally {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throughputController.finish(compactionName);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    progress.complete();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>  /**<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @param store store<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @param scanners Store file scanners.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * @param scanType Scan type.<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @param earliestPutTs Earliest put across all files.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return A compaction scanner.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      long earliestPutTs) throws IOException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param store The store.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @param scanners Store file scanners.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @param earliestPutTs Earliest put across all files.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * @return A compaction scanner.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        dropDeletesFromRow, dropDeletesToRow);<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>
 
 
 


[04/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
index 36bea79..2dd2eb6 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
@@ -307,105 +307,103 @@
 <span class="sourceLineNo">299</span>        long expectedChunks = ChecksumUtil.numChunks(<a name="line.299"></a>
 <span class="sourceLineNo">300</span>                               dataSize + HConstants.HFILEBLOCK_HEADER_SIZE,<a name="line.300"></a>
 <span class="sourceLineNo">301</span>                               bytesPerChecksum);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        LOG.info("testChecksumChunks: pread=" + pread +<a name="line.302"></a>
-<span class="sourceLineNo">303</span>                   ", bytesPerChecksum=" + bytesPerChecksum +<a name="line.303"></a>
-<span class="sourceLineNo">304</span>                   ", fileSize=" + totalSize +<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                   ", dataSize=" + dataSize +<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                   ", expectedChunks=" + expectedChunks);<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>        // Verify hbase checksums.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        assertEquals(true, hfs.useHBaseChecksum());<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>        // Read data back from file.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        FSDataInputStream is = fs.open(path);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        FSDataInputStream nochecksum = hfs.getNoChecksumFs().open(path);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        meta = new HFileContextBuilder()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>               .withCompression(algo)<a name="line.315"></a>
-<span class="sourceLineNo">316</span>               .withIncludesMvcc(true)<a name="line.316"></a>
-<span class="sourceLineNo">317</span>               .withIncludesTags(useTags)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>               .withHBaseCheckSum(true)<a name="line.318"></a>
-<span class="sourceLineNo">319</span>               .withBytesPerCheckSum(bytesPerChecksum)<a name="line.319"></a>
-<span class="sourceLineNo">320</span>               .build();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(new FSDataInputStreamWrapper(<a name="line.321"></a>
-<span class="sourceLineNo">322</span>            is, nochecksum), totalSize, hfs, path, meta);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        HFileBlock b = hbr.readBlockData(0, -1, pread, false);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        is.close();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        b.sanityCheck();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        assertEquals(dataSize, b.getUncompressedSizeWithoutHeader());<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>        // verify that we have the expected number of checksum chunks<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        assertEquals(totalSize, HConstants.HFILEBLOCK_HEADER_SIZE + dataSize +<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                     expectedChunks * HFileBlock.CHECKSUM_SIZE);<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>        // assert that we did not encounter hbase checksum verification failures<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private void validateData(DataInputStream in) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // validate data<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    for (int i = 0; i &lt; 1234; i++) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      int val = in.readInt();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      assertEquals("testChecksumCorruption: data mismatch at index " + i, i, val);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  /**<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   * This class is to test checksum behavior when data is corrupted. It mimics the following<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * behavior:<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   *  - When fs checksum is disabled, hbase may get corrupted data from hdfs. If verifyChecksum<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   *  is true, it means hbase checksum is on and fs checksum is off, so we corrupt the data.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   *  - When fs checksum is enabled, hdfs will get a different copy from another node, and will<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   *    always return correct data. So we don't corrupt the data when verifyChecksum for hbase is<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   *    off.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   */<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  static private class CorruptedFSReaderImpl extends HFileBlock.FSReaderImpl {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    /**<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     * If set to true, corrupt reads using readAtOffset(...).<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean corruptDataStream = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    public CorruptedFSReaderImpl(FSDataInputStreamWrapper istream, long fileSize, FileSystem fs,<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        Path path, HFileContext meta) throws IOException {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      super(istream, fileSize, (HFileSystem) fs, path, meta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    @Override<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    protected HFileBlock readBlockDataInternal(FSDataInputStream is, long offset,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        long onDiskSizeWithHeaderL, boolean pread, boolean verifyChecksum, boolean updateMetrics)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        throws IOException {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (verifyChecksum) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        corruptDataStream = true;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      HFileBlock b = super.readBlockDataInternal(is, offset, onDiskSizeWithHeaderL, pread,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          verifyChecksum, updateMetrics);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      corruptDataStream = false;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      return b;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    @Override<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    protected int readAtOffset(FSDataInputStream istream, byte [] dest, int destOffset, int size,<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        boolean peekIntoNextBlock, long fileOffset, boolean pread) throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      int returnValue = super.readAtOffset(istream, dest, destOffset, size, peekIntoNextBlock,<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          fileOffset, pread);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      if (!corruptDataStream) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        return returnValue;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // Corrupt 3rd character of block magic of next block's header.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      if (peekIntoNextBlock) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        dest[destOffset + size + 3] = 0b00000000;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      // We might be reading this block's header too, corrupt it.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      dest[destOffset + 1] = 0b00000000;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      // Corrupt non header data<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (size &gt; hdrSize) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        dest[destOffset + hdrSize + 1] = 0b00000000;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      return returnValue;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>}<a name="line.400"></a>
+<span class="sourceLineNo">302</span>        LOG.info("testChecksumChunks: pread={}, bytesPerChecksum={}, fileSize={}, "<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                + "dataSize={}, expectedChunks={}, compression={}", pread, bytesPerChecksum,<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            totalSize, dataSize, expectedChunks, algo.toString());<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>        // Verify hbase checksums.<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        assertEquals(true, hfs.useHBaseChecksum());<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>        // Read data back from file.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        FSDataInputStream is = fs.open(path);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        FSDataInputStream nochecksum = hfs.getNoChecksumFs().open(path);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        meta = new HFileContextBuilder()<a name="line.312"></a>
+<span class="sourceLineNo">313</span>               .withCompression(algo)<a name="line.313"></a>
+<span class="sourceLineNo">314</span>               .withIncludesMvcc(true)<a name="line.314"></a>
+<span class="sourceLineNo">315</span>               .withIncludesTags(useTags)<a name="line.315"></a>
+<span class="sourceLineNo">316</span>               .withHBaseCheckSum(true)<a name="line.316"></a>
+<span class="sourceLineNo">317</span>               .withBytesPerCheckSum(bytesPerChecksum)<a name="line.317"></a>
+<span class="sourceLineNo">318</span>               .build();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(new FSDataInputStreamWrapper(<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            is, nochecksum), totalSize, hfs, path, meta);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        HFileBlock b = hbr.readBlockData(0, -1, pread, false);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        is.close();<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        b.sanityCheck();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        assertEquals(dataSize, b.getUncompressedSizeWithoutHeader());<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>        // verify that we have the expected number of checksum chunks<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        assertEquals(totalSize, HConstants.HFILEBLOCK_HEADER_SIZE + dataSize +<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                     expectedChunks * HFileBlock.CHECKSUM_SIZE);<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>        // assert that we did not encounter hbase checksum verification failures<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void validateData(DataInputStream in) throws IOException {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    // validate data<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    for (int i = 0; i &lt; 1234; i++) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      int val = in.readInt();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      assertEquals("testChecksumCorruption: data mismatch at index " + i, i, val);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  /**<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * This class is to test checksum behavior when data is corrupted. It mimics the following<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * behavior:<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   *  - When fs checksum is disabled, hbase may get corrupted data from hdfs. If verifyChecksum<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   *  is true, it means hbase checksum is on and fs checksum is off, so we corrupt the data.<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   *  - When fs checksum is enabled, hdfs will get a different copy from another node, and will<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   *    always return correct data. So we don't corrupt the data when verifyChecksum for hbase is<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   *    off.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  static private class CorruptedFSReaderImpl extends HFileBlock.FSReaderImpl {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    /**<a name="line.354"></a>
+<span class="sourceLineNo">355</span>     * If set to true, corrupt reads using readAtOffset(...).<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    boolean corruptDataStream = false;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public CorruptedFSReaderImpl(FSDataInputStreamWrapper istream, long fileSize, FileSystem fs,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        Path path, HFileContext meta) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      super(istream, fileSize, (HFileSystem) fs, path, meta);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    @Override<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected HFileBlock readBlockDataInternal(FSDataInputStream is, long offset,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        long onDiskSizeWithHeaderL, boolean pread, boolean verifyChecksum, boolean updateMetrics)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        throws IOException {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      if (verifyChecksum) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        corruptDataStream = true;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      HFileBlock b = super.readBlockDataInternal(is, offset, onDiskSizeWithHeaderL, pread,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          verifyChecksum, updateMetrics);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      corruptDataStream = false;<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      return b;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    @Override<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    protected int readAtOffset(FSDataInputStream istream, byte [] dest, int destOffset, int size,<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        boolean peekIntoNextBlock, long fileOffset, boolean pread) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      int returnValue = super.readAtOffset(istream, dest, destOffset, size, peekIntoNextBlock,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          fileOffset, pread);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      if (!corruptDataStream) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        return returnValue;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      // Corrupt 3rd character of block magic of next block's header.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      if (peekIntoNextBlock) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        dest[destOffset + size + 3] = 0b00000000;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      // We might be reading this block's header too, corrupt it.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      dest[destOffset + 1] = 0b00000000;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      // Corrupt non header data<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      if (size &gt; hdrSize) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        dest[destOffset + hdrSize + 1] = 0b00000000;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      return returnValue;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
+<span class="sourceLineNo">398</span>}<a name="line.398"></a>
 
 
 


[27/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
index 723d68b..957594e 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1311">Canary.ZookeeperMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1359">Canary.ZookeeperMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
 </li>
 </ul>
@@ -178,10 +178,10 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected </code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                 boolean&nbsp;useRegExp,
-                <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                 boolean&nbsp;treatFailureAsError,
                 long&nbsp;allowedFailures)</code>&nbsp;</td>
@@ -244,7 +244,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hosts</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1312">hosts</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1360">hosts</a></pre>
 </li>
 </ul>
 <a name="znode">
@@ -253,7 +253,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>znode</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1313">znode</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1361">znode</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -262,7 +262,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1314">timeout</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1362">timeout</a></pre>
 </li>
 </ul>
 </li>
@@ -273,16 +273,16 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-long-">
+<a name="ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-long-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZookeeperMonitor</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1316">ZookeeperMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1364">ZookeeperMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                            boolean&nbsp;useRegExp,
-                           <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                           <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                            boolean&nbsp;treatFailureAsError,
                            long&nbsp;allowedFailures)</pre>
@@ -302,7 +302,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1338">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1387">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -317,7 +317,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getSink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1368">getSink</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1417">getSink</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
index 62cbf99..c48427a 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
@@ -122,8 +122,9 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.194">Canary.ZookeeperStdOutSink</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.205">Canary.ZookeeperStdOutSink</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></pre>
+<div class="block">Output for 'zookeeper' mode.</div>
 </li>
 </ul>
 </div>
@@ -161,7 +162,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#publishReadFailure-java.lang.String-java.lang.String-">publishReadFailure</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;zNode,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#publishReadFailure-java.lang.String-java.lang.String-">publishReadFailure</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;znode,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server)</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
@@ -205,7 +206,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZookeeperStdOutSink</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#line.194">ZookeeperStdOutSink</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#line.205">ZookeeperStdOutSink</a>()</pre>
 </li>
 </ul>
 </li>
@@ -222,7 +223,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#line.196">publishReadFailure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;zNode,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#line.206">publishReadFailure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;znode,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server)</pre>
 </li>
 </ul>
@@ -232,7 +233,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#line.201">publishReadTiming</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;znode,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#line.211">publishReadTiming</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;znode,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server,
                               long&nbsp;msTime)</pre>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
index 1e63ed7..9e2840d 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
@@ -117,9 +117,10 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.263">Canary.ZookeeperTask</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.281">Canary.ZookeeperTask</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
+<div class="block">Run a single zookeeper Task and then exit.</div>
 </li>
 </ul>
 </div>
@@ -226,7 +227,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.264">connection</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.282">connection</a></pre>
 </li>
 </ul>
 <a name="host">
@@ -235,7 +236,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>host</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.265">host</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.283">host</a></pre>
 </li>
 </ul>
 <a name="znode">
@@ -244,7 +245,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>znode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.266">znode</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.284">znode</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -253,7 +254,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.267">timeout</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.285">timeout</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -262,7 +263,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.268">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.286">sink</a></pre>
 </li>
 </ul>
 </li>
@@ -279,7 +280,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZookeeperTask</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.270">ZookeeperTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.288">ZookeeperTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;host,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;znode,
                      int&nbsp;timeout,
@@ -300,7 +301,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.279">call</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html#line.297">call</a>()
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
index 16a36c4..456568c 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":9,"i10":9};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":9,"i11":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,21 +114,25 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.118">Canary</a>
+public final class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.123">Canary</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.apache.hadoop.util.Tool</pre>
-<div class="block">HBase Canary Tool, that that can be used to do
- "canary monitoring" of a running HBase cluster.
+<div class="block">HBase Canary Tool for "canary monitoring" of a running HBase cluster.
 
- Here are three modes
- 1. region mode - Foreach region tries to get one row per column family
- and outputs some information about failure or latency.
+ There are three modes:
+ <ol>
+ <li>region mode (Default): For each region, try to get one row per column family outputting
+ information on failure (ERROR) or else the latency.
+ </li>
 
- 2. regionserver mode - Foreach regionserver tries to get one row from one table
- selected randomly and outputs some information about failure or latency.
+ <li>regionserver mode: For each regionserver try to get one row from one table selected
+ randomly outputting information on failure (ERROR) or else the latency.
+ </li>
 
- 3. zookeeper mode - for each zookeeper instance, selects a zNode and
- outputs some information about failure or latency.</div>
+ <li>zookeeper mode: for each zookeeper instance, selects a znode outputting information on
+ failure (ERROR) or else the latency.
+ </li>
+ </ol></div>
 </li>
 </ul>
 </div>
@@ -149,44 +153,57 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></span></code>
+<div class="block">A Monitor super-class can be extended by users</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></span></code>
+<div class="block">A monitor for region mode.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></span></code>
+<div class="block">A monitor for regionserver mode</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></span></code>
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package private) static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerTask</a></span></code>
-<div class="block">Get one row from a region on the regionserver and outputs the latency, or the failure.</div>
+<div class="block">Run a single RegionServer Task and then exit.</div>
 </td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></span></code>
+<div class="block">By Region, for 'region'  mode.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package private) static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionTask</a></span></code>
-<div class="block">For each column family of the region tries to get one row and outputs the latency, or the
- failure.</div>
+<div class="block">Run a single Region Task and then exit.</div>
 </td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static interface&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></span></code>
+<div class="block">Sink interface used by the canary to output information</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></span></code>
+<div class="block">Simple implementation of canary sink that allows plotting to a file or standard output.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static class&nbsp;</code></td>
@@ -194,11 +211,15 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></span></code>
+<div class="block">Output for 'zookeeper' mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperTask</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperTask</a></span></code>
+<div class="block">Run a single zookeeper Task and then exit.</div>
+</td>
 </tr>
 </table>
 </li>
@@ -225,7 +246,9 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#configuredReadTableTimeouts">configuredReadTableTimeouts</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#configuredReadTableTimeouts">configuredReadTableTimeouts</a></span></code>
+<div class="block">This is a Map of table to timeout.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
@@ -285,7 +308,9 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#regionServerMode">regionServerMode</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#regionServerMode">regionServerMode</a></span></code>
+<div class="block">True if we are to run in 'regionServer' mode.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></td>
@@ -321,7 +346,9 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#zookeeperMode">zookeeperMode</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#zookeeperMode">zookeeperMode</a></span></code>
+<div class="block">True if we are to run in zookeeper 'mode'.</div>
+</td>
 </tr>
 </table>
 </li>
@@ -341,6 +368,9 @@ implements org.apache.hadoop.util.Tool</pre>
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#Canary--">Canary</a></span>()</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#Canary-java.util.concurrent.ExecutorService-">Canary</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#Canary-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.Sink-">Canary</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
       <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink)</code>&nbsp;</td>
 </tr>
@@ -368,14 +398,19 @@ implements org.apache.hadoop.util.Tool</pre>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#getReadFailures--">getReadFailures</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#getSink-org.apache.hadoop.conf.Configuration-java.lang.Class-">getSink</a></span>(org.apache.hadoop.conf.Configuration&nbsp;configuration,
+       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&nbsp;clazz)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#getWriteFailures--">getWriteFailures</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#main-java.lang.String:A-">main</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#newMonitor-org.apache.hadoop.hbase.client.Connection-int-java.lang.String:A-">newMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
           int&nbsp;index,
@@ -383,32 +418,22 @@ implements org.apache.hadoop.util.Tool</pre>
 <div class="block">A Factory method for <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool"><code>Canary.Monitor</code></a>.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#parseArgs-java.lang.String:A-">parseArgs</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#printUsageAndExit--">printUsageAndExit</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#run-java.lang.String:A-">run</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
-<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
-     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
-     boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
-</tr>
 <tr id="i10" class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
@@ -421,6 +446,16 @@ implements org.apache.hadoop.util.Tool</pre>
 <div class="block">Canary entry point for specified table.</div>
 </td>
 </tr>
+<tr id="i11" class="rowColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
+     <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDesc,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
+     boolean&nbsp;rawScanEnabled,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -449,7 +484,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>USAGE_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.562">USAGE_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.567">USAGE_EXIT_CODE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.USAGE_EXIT_CODE">Constant Field Values</a></dd>
@@ -462,7 +497,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>INIT_ERROR_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.563">INIT_ERROR_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.568">INIT_ERROR_EXIT_CODE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.INIT_ERROR_EXIT_CODE">Constant Field Values</a></dd>
@@ -475,7 +510,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>TIMEOUT_ERROR_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.564">TIMEOUT_ERROR_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.569">TIMEOUT_ERROR_EXIT_CODE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.TIMEOUT_ERROR_EXIT_CODE">Constant Field Values</a></dd>
@@ -488,7 +523,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ERROR_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.565">ERROR_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.570">ERROR_EXIT_CODE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.ERROR_EXIT_CODE">Constant Field Values</a></dd>
@@ -501,7 +536,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>FAILURE_EXIT_CODE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.566">FAILURE_EXIT_CODE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.571">FAILURE_EXIT_CODE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.FAILURE_EXIT_CODE">Constant Field Values</a></dd>
@@ -514,7 +549,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_INTERVAL</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.568">DEFAULT_INTERVAL</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.573">DEFAULT_INTERVAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.DEFAULT_INTERVAL">Constant Field Values</a></dd>
@@ -527,7 +562,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_TIMEOUT</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.570">DEFAULT_TIMEOUT</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.575">DEFAULT_TIMEOUT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.DEFAULT_TIMEOUT">Constant Field Values</a></dd>
@@ -540,7 +575,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_THREADS_NUM</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.571">MAX_THREADS_NUM</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.576">MAX_THREADS_NUM</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.MAX_THREADS_NUM">Constant Field Values</a></dd>
@@ -553,7 +588,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.573">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.578">LOG</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_WRITE_TABLE_NAME">
@@ -562,7 +597,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_TABLE_NAME</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.575">DEFAULT_WRITE_TABLE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.580">DEFAULT_WRITE_TABLE_NAME</a></pre>
 </li>
 </ul>
 <a name="CANARY_TABLE_FAMILY_NAME">
@@ -571,7 +606,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>CANARY_TABLE_FAMILY_NAME</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.578">CANARY_TABLE_FAMILY_NAME</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.583">CANARY_TABLE_FAMILY_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.CANARY_TABLE_FAMILY_NAME">Constant Field Values</a></dd>
@@ -584,7 +619,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.580">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.585">conf</a></pre>
 </li>
 </ul>
 <a name="interval">
@@ -593,7 +628,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>interval</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.581">interval</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.586">interval</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -602,7 +637,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.582">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.587">sink</a></pre>
 </li>
 </ul>
 <a name="useRegExp">
@@ -611,7 +646,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>useRegExp</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.584">useRegExp</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.589">useRegExp</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -620,7 +655,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.585">timeout</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.590">timeout</a></pre>
 </li>
 </ul>
 <a name="failOnError">
@@ -629,7 +664,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>failOnError</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.586">failOnError</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.591">failOnError</a></pre>
 </li>
 </ul>
 <a name="regionServerMode">
@@ -638,7 +673,8 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerMode</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.587">regionServerMode</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.596">regionServerMode</a></pre>
+<div class="block">True if we are to run in 'regionServer' mode.</div>
 </li>
 </ul>
 <a name="zookeeperMode">
@@ -647,7 +683,8 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>zookeeperMode</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.588">zookeeperMode</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.601">zookeeperMode</a></pre>
+<div class="block">True if we are to run in zookeeper 'mode'.</div>
 </li>
 </ul>
 <a name="permittedFailures">
@@ -656,7 +693,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>permittedFailures</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.589">permittedFailures</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.603">permittedFailures</a></pre>
 </li>
 </ul>
 <a name="regionServerAllRegions">
@@ -665,7 +702,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerAllRegions</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.590">regionServerAllRegions</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.604">regionServerAllRegions</a></pre>
 </li>
 </ul>
 <a name="writeSniffing">
@@ -674,7 +711,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSniffing</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.591">writeSniffing</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.605">writeSniffing</a></pre>
 </li>
 </ul>
 <a name="configuredWriteTableTimeout">
@@ -683,7 +720,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>configuredWriteTableTimeout</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.592">configuredWriteTableTimeout</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.606">configuredWriteTableTimeout</a></pre>
 </li>
 </ul>
 <a name="treatFailureAsError">
@@ -692,7 +729,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>treatFailureAsError</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.593">treatFailureAsError</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.607">treatFailureAsError</a></pre>
 </li>
 </ul>
 <a name="writeTableName">
@@ -701,7 +738,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTableName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.594">writeTableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.608">writeTableName</a></pre>
 </li>
 </ul>
 <a name="configuredReadTableTimeouts">
@@ -710,7 +747,10 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>configuredReadTableTimeouts</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.595">configuredReadTableTimeouts</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.615">configuredReadTableTimeouts</a></pre>
+<div class="block">This is a Map of table to timeout. The timeout is for reading all regions in the table; i.e.
+ we aggregate time to fetch each region and it needs to be less than this value else we
+ log an ERROR.</div>
 </li>
 </ul>
 <a name="executor">
@@ -719,7 +759,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executor</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.597">executor</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.617">executor</a></pre>
 </li>
 </ul>
 </li>
@@ -736,7 +776,16 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>Canary</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.599">Canary</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.619">Canary</a>()</pre>
+</li>
+</ul>
+<a name="Canary-java.util.concurrent.ExecutorService-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>Canary</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.623">Canary</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor)</pre>
 </li>
 </ul>
 <a name="Canary-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.Sink-">
@@ -745,8 +794,8 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.603">Canary</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-              <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.628">Canary</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+       <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink)</pre>
 </li>
 </ul>
 </li>
@@ -763,7 +812,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.609">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.634">getConf</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -776,7 +825,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.614">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.639">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -789,7 +838,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseArgs</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.618">parseArgs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.643">parseArgs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 <a name="run-java.lang.String:A-">
@@ -798,7 +847,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.779">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.806">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -814,7 +863,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadFailures</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.849">getReadFailures</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.876">getReadFailures</a>()</pre>
 </li>
 </ul>
 <a name="getWriteFailures--">
@@ -823,7 +872,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteFailures</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.853">getWriteFailures</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.880">getWriteFailures</a>()</pre>
 </li>
 </ul>
 <a name="printUsageAndExit--">
@@ -832,7 +881,17 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.857">printUsageAndExit</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.884">printUsageAndExit</a>()</pre>
+</li>
+</ul>
+<a name="getSink-org.apache.hadoop.conf.Configuration-java.lang.Class-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getSink</h4>
+<pre><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.926">getSink</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration,
+                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&nbsp;clazz)</pre>
 </li>
 </ul>
 <a name="newMonitor-org.apache.hadoop.hbase.client.Connection-int-java.lang.String:A-">
@@ -841,11 +900,11 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>newMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.898">newMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.940">newMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                  int&nbsp;index,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 <div class="block">A Factory method for <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool"><code>Canary.Monitor</code></a>.
- Can be overridden by user.</div>
+ Makes a RegionServerMonitor, or a ZooKeeperMonitor, or a RegionMonitor.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>index</code> - a start index for monitor target</dd>
@@ -861,7 +920,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1254">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1321">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
                                         <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
@@ -876,15 +935,15 @@ implements org.apache.hadoop.util.Tool</pre>
 </dl>
 </li>
 </ul>
-<a name="sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">
+<a name="sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1272">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1337">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
                                         <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-                                        <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
+                                        <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDesc,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                                         <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
                                         boolean&nbsp;rawScanEnabled,
@@ -902,7 +961,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1596">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1628">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html
index b190b04..fc9c834 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html
@@ -104,11 +104,15 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>private static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></span></code>
+<div class="block">A monitor for region mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></span></code>
+<div class="block">A monitor for regionserver mode</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static class&nbsp;</code></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.RegionTask.TaskType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.RegionTask.TaskType.html b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.RegionTask.TaskType.html
index ec9720c..9a727f7 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.RegionTask.TaskType.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.RegionTask.TaskType.html
@@ -139,25 +139,25 @@ the order they are declared.</div>
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="../../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
      boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;readLatency)</code>
+<div class="block">Canary entry point for specified table.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
+     <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDesc,
      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
      boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;readLatency)</code>
-<div class="block">Canary entry point for specified table.</div>
-</td>
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>


[17/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a nam

<TRUNCATED>

[25/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 7becf50..5b9d987 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -332,2472 +332,2473 @@
 <span class="sourceLineNo">324</span>      confPrintThreshold = 10;<a name="line.324"></a>
 <span class="sourceLineNo">325</span>    }<a name="line.325"></a>
 <span class="sourceLineNo">326</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            "parallelPutCountPrintThreshold={}", getColumnFamilyName(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        this.memstore.getClass().getSimpleName(), policyName,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        this.verifyBulkLoads, this.parallelPutCountPrintThreshold);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  /**<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @return MemStore Instance to use in this store.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private MemStore getMemstore() {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    MemStore ms = null;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.getTableName().isSystemTable()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } else {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    if (inMemoryCompaction == null) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      inMemoryCompaction =<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    switch (inMemoryCompaction) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      case NONE:<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            new Object[] { conf, this.comparator,<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        break;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      default:<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.360"></a>
-<span class="sourceLineNo">361</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return ms;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * Creates the cache config.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @param family The current column family.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>  /**<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * Creates the store engine configured for the given Store.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *              being passed to coprocessors via the compactor.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @param conf Store configuration.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @return StoreEngine to use.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      CellComparator kvComparator) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return StoreEngine.create(store, conf, comparator);<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>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param family<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @return TTL in seconds of the specified family<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   */<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    long ttl = family.getTimeToLive();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (ttl == HConstants.FOREVER) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      // Default is unlimited ttl.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      ttl = Long.MAX_VALUE;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    } else if (ttl == -1) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      ttl = Long.MAX_VALUE;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    } else {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      // Second -&gt; ms adjust for user data<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      ttl *= 1000;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    return ttl;<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>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public String getColumnFamilyName() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return this.family.getNameAsString();<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>  @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  public TableName getTableName() {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return this.getRegionInfo().getTable();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public FileSystem getFileSystem() {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    return this.fs.getFileSystem();<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return this.fs;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  /* Implementation of StoreConfigInformation */<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public long getStoreFileTtl() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<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>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public long getMemStoreFlushSize() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    return this.region.memstoreFlushSize;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  @Override<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  public MemStoreSize getFlushableSize() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    return this.memstore.getFlushableSize();<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>  @Override<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public MemStoreSize getSnapshotSize() {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    return this.memstore.getSnapshotSize();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>  @Override<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public long getCompactionCheckMultiplier() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return this.compactionCheckMultiplier;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  public long getBlockingFileCount() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return blockingFileCount;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * @param conf The configuration<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.465"></a>
-<span class="sourceLineNo">466</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Returns the configured checksum algorithm.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * @param conf The configuration<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @return The checksum algorithm that is set in the configuration<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    if (checksumName == null) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      return ChecksumType.getDefaultChecksumType();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    } else {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      return ChecksumType.nameToType(checksumName);<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>   * @return how many bytes to write between status checks<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public static int getCloseCheckInterval() {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    return closeCheckInterval;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>  @Override<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    return this.family;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>  }<a name="line.493"></a>
-<span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  @Override<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  public OptionalLong getMaxSequenceId() {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>  @Override<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @param hri {@link RegionInfo} for the region.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   * @return Path to family/Store home directory.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>   */<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  @Deprecated<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      final RegionInfo hri, final byte[] family) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<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>  /**<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * @param encodedName Encoded region name.<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   * @return Path to family/Store home directory.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  @Deprecated<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      final String encodedName, final byte[] family) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  }<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>   * @return the data block encoder<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   */<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return dataBlockEncoder;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>  /**<a name="line.536"></a>
-<span class="sourceLineNo">537</span>   * Should be used only in tests.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * @param blockEncoder the block delta encoder to use<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   */<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    this.dataBlockEncoder = blockEncoder;<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>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.545"></a>
-<span class="sourceLineNo">546</span>   * from the given directory.<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * @throws IOException<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   */<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return openStoreFiles(files);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return Collections.emptyList();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // initialize the thread pool for opening store files in parallel..<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-"<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    int totalValidStoreFile = 0;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // open each store file in parallel<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      totalValidStoreFile++;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    IOException ioe = null;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        try {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          HStoreFile storeFile = completionService.take().get();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          if (storeFile != null) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>            long length = storeFile.getReader().length();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            this.storeSize.addAndGet(length);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            this.totalUncompressedBytes<a name="line.580"></a>
-<span class="sourceLineNo">581</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            LOG.debug("loaded {}", storeFile);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            results.add(storeFile);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        } catch (InterruptedException e) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        } catch (ExecutionException e) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.588"></a>
-<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    } finally {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    if (ioe != null) {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // close StoreFile readers<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      boolean evictOnClose =<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      for (HStoreFile file : results) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        try {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          if (file != null) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>            file.closeStoreFile(evictOnClose);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          }<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        } catch (IOException e) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          LOG.warn("Could not close store file", e);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      throw ioe;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    return results;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  @Override<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public void refreshStoreFiles() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    refreshStoreFilesInternal(newFiles);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<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>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * region replicas to keep up to date with the primary region files.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * @throws IOException<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   */<a name="line.623"></a>
-<span class="sourceLineNo">624</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    for (String file : newFiles) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    }<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    refreshStoreFilesInternal(storeFiles);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  /**<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * been opened, and removes the store file readers for store files no longer<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * the primary region files.<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * @throws IOException<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   */<a name="line.638"></a>
-<span class="sourceLineNo">639</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    for (HStoreFile sf : currentFiles) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    for (HStoreFile sf : compactedFiles) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // Exclude the files that have already been compacted<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (toBeAddedFiles.isEmpty() &amp;&amp; toBeRemovedFiles.isEmpty()) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      return;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    LOG.info("Refreshing store files for region " + this.getRegionInfo().getRegionNameAsString()<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      + " files to add: " + toBeAddedFiles + " files to remove: " + toBeRemovedFiles);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    Set&lt;HStoreFile&gt; toBeRemovedStoreFiles = new HashSet&lt;&gt;(toBeRemovedFiles.size());<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    for (StoreFileInfo sfi : toBeRemovedFiles) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      toBeRemovedStoreFiles.add(currentFilesSet.get(sfi));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    // try to open the files<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    List&lt;HStoreFile&gt; openedFiles = openStoreFiles(toBeAddedFiles);<a name="line.675"></a>
-<span class="sourceLineNo">676</span><a name="line.676"></a>
-<span class="sourceLineNo">677</span>    // propogate the file changes to the underlying store file manager<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); //won't throw an exception<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>    // Advance the memstore read point to be at least the new store files seqIds so that<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    // readers might pick it up. This assumes that the store is not getting any writes (otherwise<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // in-flight transactions might be made visible)<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    if (!toBeAddedFiles.isEmpty()) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      // we must have the max sequence id here as we do have several store files<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      region.getMVCC().advanceTo(this.getMaxSequenceId().getAsLong());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    completeCompaction(toBeRemovedStoreFiles);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @VisibleForTesting<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  protected HStoreFile createStoreFileAndReader(final Path p) throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    StoreFileInfo info = new StoreFileInfo(conf, this.getFileSystem(), p);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return createStoreFileAndReader(info);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  private HStoreFile createStoreFileAndReader(StoreFileInfo info) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    info.setRegionCoprocessorHost(this.region.getCoprocessorHost());<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    HStoreFile storeFile = new HStoreFile(this.getFileSystem(), info, this.conf, this.cacheConf,<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        this.family.getBloomFilterType(), isPrimaryReplicaStore());<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    storeFile.initReader();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    return storeFile;<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  }<a name="line.703"></a>
-<span class="sourceLineNo">704</span><a name="line.704"></a>
-<span class="sourceLineNo">705</span>  /**<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * This message intends to inform the MemStore that next coming updates<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   * are going to be part of the replaying edits from WAL<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   */<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  public void startReplayingFromWAL(){<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    this.memstore.startReplayingFromWAL();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * are done<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  public void stopReplayingFromWAL(){<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    this.memstore.stopReplayingFromWAL();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  /**<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * Adds a value to the memstore<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void add(final Cell cell, MemStoreSizing memstoreSizing) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    lock.readLock().lock();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    try {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.728"></a>
-<span class="sourceLineNo">729</span>          "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      this.memstore.add(cell, memstoreSizing);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    } finally {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      lock.readLock().unlock();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      currentParallelPutCount.decrementAndGet();<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    }<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>  /**<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * Adds the specified value to the memstore<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   */<a name="line.740"></a>
-<span class="sourceLineNo">741</span>  public void add(final Iterable&lt;Cell&gt; cells, MemStoreSizing memstoreSizing) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    lock.readLock().lock();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    try {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.745"></a>
-<span class="sourceLineNo">746</span>            "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      memstore.add(cells, memstoreSizing);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    } finally {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      lock.readLock().unlock();<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      currentParallelPutCount.decrementAndGet();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Override<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public long timeOfOldestEdit() {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    return memstore.timeOfOldestEdit();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
-<span class="sourceLineNo">761</span>   * @return All store files.<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   */<a name="line.762"></a>
-<span class="sourceLineNo">763</span>  @Override<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  public Collection&lt;HStoreFile&gt; getStorefiles() {<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return this.storeEngine.getStoreFileManager().getStorefiles();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  @Override<a name="line.768"></a>
-<span class="sourceLineNo">769</span>  public Collection&lt;HStoreFile&gt; getCompactedFiles() {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    return this.storeEngine.getStoreFileManager().getCompactedfiles();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>  /**<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   * This throws a WrongRegionException if the HFile does not fit in this region, or an<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * InvalidHFileException if the HFile is not valid.<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   */<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void assertBulkLoadHFileOk(Path srcPath) throws IOException {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    HFile.Reader reader  = null;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    try {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      LOG.info("Validating hfile at " + srcPath + " for inclusion in "<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          + "store " + this + " region " + this.getRegionInfo().getRegionNameAsString());<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      reader = HFile.createReader(srcPath.getFileSystem(conf), srcPath, cacheConf,<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        isPrimaryReplicaStore(), conf);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      reader.loadFileInfo();<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>      Optional&lt;byte[]&gt; firstKey = reader.getFirstRowKey();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      Preconditions.checkState(firstKey.isPresent(), "First key can not be null");<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      Optional&lt;Cell&gt; lk = reader.getLastKey();<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Preconditions.checkState(lk.isPresent(), "Last key can not be null");<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      byte[] lastKey =  CellUtil.cloneRow(lk.get());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      if (LOG.isDebugEnabled()) {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        LOG.debug("HFile bounds: first=" + Bytes.toStringBinary(firstKey.get()) +<a name="line.793"></a>
-<span class="sourceLineNo">794</span>            " last=" + Bytes.toStringBinary(lastKey));<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        LOG.debug("Region bounds: first=" +<a name="line.795"></a>
-<span class="sourceLineNo">796</span>            Bytes.toStringBinary(getRegionInfo().getStartKey()) +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>            " last=" + Bytes.toStringBinary(getRegionInfo().getEndKey()));<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      }<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      if (!this.getRegionInfo().containsRange(firstKey.get(), lastKey)) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        throw new WrongRegionException(<a name="line.801"></a>
-<span class="sourceLineNo">802</span>            "Bulk load file " + srcPath.toString() + " does not fit inside region "<a name="line.802"></a>
-<span class="sourceLineNo">803</span>            + this.getRegionInfo().getRegionNameAsString());<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span>      if(reader.length() &gt; conf.getLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          HConstants.DEFAULT_MAX_FILE_SIZE)) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        LOG.warn("Trying to bulk load hfile " + srcPath + " with size: " +<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            reader.length() + " bytes can be problematic as it may lead to oversplitting.");<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>      if (verifyBulkLoads) {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        long verificationStartTime = EnvironmentEdgeManager.currentTime();<a name="line.813"></a>
-<span class="sourceLineNo">814</span>        LOG.info("Full verification started for bulk load hfile: {}", srcPath);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>        Cell prevCell = null;<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        HFileScanner scanner = reader.getScanner(false, false, false);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        scanner.seekTo();<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        do {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>          Cell cell = scanner.getCell();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          if (prevCell != null) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            if (comparator.compareRows(prevCell, cell) &gt; 0) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              throw new InvalidHFileException("Previous row is greater than"<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                  + " current row: path=" + srcPath + " previous="<a name="line.823"></a>
-<span class="sourceLineNo">824</span>                  + CellUtil.getCellKeyAsString(prevCell) + " current="<a name="line.824"></a>
-<span class="sourceLineNo">825</span>                  + CellUtil.getCellKeyAsString(cell));<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            if (CellComparator.getInstance().compareFamilies(prevCell, cell) != 0) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>              throw new InvalidHFileException("Previous key had different"<a name="line.828"></a>
-<span class="sourceLineNo">829</span>                  + " family compared to current key: path=" + srcPath<a name="line.829"></a>
-<span class="sourceLineNo">830</span>                  + " previous="<a name="line.830"></a>
-<span class="sourceLineNo">831</span>                  + Bytes.toStringBinary(prevCell.getFamilyArray(), prevCell.getFamilyOffset(),<a name="line.831"></a>
-<span class="sourceLineNo">832</span>                      prevCell.getFamilyLength())<a name="line.832"></a>
-<span class="sourceLineNo">833</span>                  + " current="<a name="line.833"></a>
-<span class="sourceLineNo">834</span>                  + Bytes.toStringBinary(cell.getFamilyArray(), cell.getFamilyOffset(),<a name="line.834"></a>
-<span class="sourceLineNo">835</span>                      cell.getFamilyLength()));<a name="line.835"></a>
-<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          prevCell = cell;<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } while (scanner.next());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      LOG.info("Full verification complete for bulk load hfile: " + srcPath.toString()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>         + " took " + (EnvironmentEdgeManager.currentTime() - verificationStartTime)<a name="line.841"></a>
-<span class="sourceLineNo">842</span>         + " ms");<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    } finally {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      if (reader != null) reader.close();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  /**<a name="line.849"></a>
-<span class="sourceLineNo">850</span>   * This method should only be called from Region. It is assumed that the ranges of values in the<a name="line.850"></a>
-<span class="sourceLineNo">851</span>   * HFile fit within the stores assigned region. (assertBulkLoadHFileOk checks this)<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   *<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * @param srcPathStr<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * @param seqNum sequence Id associated with the HFile<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  public Pair&lt;Path, Path&gt; preBulkLoadHFile(String srcPathStr, long seqNum) throws IOException {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    Path srcPath = new Path(srcPathStr);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    return fs.bulkLoadStoreFile(getColumnFamilyName(), srcPath, seqNum);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  }<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public Path bulkLoadHFile(byte[] family, String srcPathStr, Path dstPath) throws IOException {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    Path srcPath = new Path(srcPathStr);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    try {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      fs.commitStoreFile(srcPath, dstPath);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    } finally {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      if (this.getCoprocessorHost() != null) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        this.getCoprocessorHost().postCommitStoreFile(family, srcPath, dstPath);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>    LOG.info("Loaded HFile " + srcPath + " into store '" + getColumnFamilyName() + "' as "<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        + dstPath + " - updating store file list.");<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    HStoreFile sf = createStoreFileAndReader(dstPath);<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    bulkLoadHFile(sf);<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    LOG.info("Successfully loaded store file {} into store {} (new location: {})",<a name="line.877"></a>
-<span class="sourceLineNo">878</span>        srcPath, this, dstPath);<a name="line.878"></a>
-<span class="sourceLineNo">879</span><a name="line.879"></a>
-<span class="sourceLineNo">880</span>    return dstPath;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  public void bulkLoadHFile(StoreFileInfo fileInfo) throws IOException {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    HStoreFile sf = createStoreFileAndReader(fileInfo);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    bulkLoadHFile(sf);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
-<span class="sourceLineNo">887</span><a name="line.887"></a>
-<span class="sourceLineNo">888</span>  private void bulkLoadHFile(HStoreFile sf) throws IOException {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    StoreFileReader r = sf.getReader();<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.storeSize.addAndGet(r.length());<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>    // Append the new storefile into the list<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    this.lock.writeLock().lock();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    try {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      this.storeEngine.getStoreFileManager().insertNewFiles(Lists.newArrayList(sf));<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    } finally {<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // We need the lock, as long as we are updating the storeFiles<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // or changing the memstore. Let us release it before calling<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      // notifyChangeReadersObservers. See HBASE-4485 for a possible<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      // deadlock scenario that could have happened if continue to hold<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      // the lock.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.lock.writeLock().unlock();<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    LOG.info("Loaded HFile " + sf.getFileInfo() + " into store '" + getColumnFamilyName());<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    if (LOG.isTraceEnabled()) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      String traceMessage = "BULK LOAD time,size,store size,store files ["<a name="line.907"></a>
-<span class="sourceLineNo">908</span>          + EnvironmentEdgeManager.currentTime() + "," + r.length() + "," + storeSize<a name="line.908"></a>
-<span class="sourceLineNo">909</span>          + "," + storeEngine.getStoreFileManager().getStorefileCount() + "]";<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      LOG.trace(traceMessage);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>  /**<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * Close all the readers We don't need to worry about subsequent requests because the Region holds<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   * a write lock that will prevent any more reads or writes.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>   * @return the {@link StoreFile StoreFiles} that were previously being used.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>   * @throws IOException on failure<a name="line.918"></a>
-<span class="sourceLineNo">919</span>   */<a name="line.919"></a>
-<span class="sourceLineNo">920</span>  public ImmutableCollection&lt;HStoreFile&gt; close() throws IOException {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    this.archiveLock.lock();<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    this.lock.writeLock().lock();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    try {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // Clear so metrics doesn't find them.<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      ImmutableCollection&lt;HStoreFile&gt; result = storeEngine.getStoreFileManager().clearFiles();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      Collection&lt;HStoreFile&gt; compactedfiles =<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          storeEngine.getStoreFileManager().clearCompactedFiles();<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // clear the compacted files<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (CollectionUtils.isNotEmpty(compactedfiles)) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        removeCompactedfiles(compactedfiles, true);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (!result.isEmpty()) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        // initialize the thread pool for closing store files in parallel.<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        ThreadPoolExecutor storeFileCloserThreadPool = this.region<a name="line.934"></a>
-<span class="sourceLineNo">935</span>            .getStoreFileOpenAndCloseThreadPool("StoreFileCloserThread-"<a name="line.935"></a>
-<span class="sourceLineNo">936</span>              + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>        // close each store file in parallel<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        CompletionService&lt;Void&gt; completionService =<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          new ExecutorCompletionService&lt;&gt;(storeFileCloserThreadPool);<a name="line.940"></a>
-<span class="sourceLineNo">941</span>        for (HStoreFile f : result) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          completionService.submit(new Callable&lt;Void&gt;() {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>            @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>            public Void call() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>              boolean evictOnClose =<a name="line.945"></a>
-<span class="sourceLineNo">946</span>                  cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.946"></a>
-<span class="sourceLineNo">947</span>              f.closeStoreFile(evictOnClose);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>              return null;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>            }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>          });<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>        IOException ioe = null;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        try {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          for (int i = 0; i &lt; result.size(); i++) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>            try {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>              Future&lt;Void&gt; future = completionService.take();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>              future.get();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>            } catch (InterruptedException e) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>              if (ioe == null) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>                ioe = new InterruptedIOException();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>                ioe.initCause(e);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>              }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>            } catch (ExecutionException e) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>              if (ioe == null) ioe = new IOException(e.getCause());<a name="line.965"></a>
-<span class="sourceLineNo">966</span>            }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>          }<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        } finally {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          storeFileCloserThreadPool.shutdownNow();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        if (ioe != null) throw ioe;<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      LOG.trace("Closed {}", this);<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      return result;<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    } finally {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      this.lock.writeLock().unlock();<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      this.archiveLock.unlock();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>  }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Snapshot this stores memstore. Call before running<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * {@link #flushCache(long, MemStoreSnapshot, MonitoredTask, ThroughputController,<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   * FlushLifeCycleTracker)}<a name="line.984"></a>
-<span class="sourceLineNo">985</span>   *  so it has some work to do.<a name="line.985"></a>
-<span class="sourceLineNo">986</span>   */<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  void snapshot() {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    this.lock.writeLock().lock();<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    try {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      this.memstore.snapshot();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    } finally {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      this.lock.writeLock().unlock();<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
-<span class="sourceLineNo">995</span><a name="line.995"></a>
-<span class="sourceLineNo">996</span>  /**<a name="line.996"></a>
-<span class="sourceLineNo">997</span>   * Write out current snapshot. Presumes {@link #snapshot()} has been called previously.<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   * @param logCacheFlushId flush sequence number<a name="line.998"></a>
-<span class="sourceLineNo">999</span>   * @param snapshot<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>   * @param status<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * @param throughputController<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * @return The path name of the tmp file to which the store was flushed<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @throws IOException if exception occurs during process<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>  protected List&lt;Path&gt; flushCache(final long logCacheFlushId, MemStoreSnapshot snapshot,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      MonitoredTask status, ThroughputController throughputController,<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    // If an exception happens flushing, we let it out without clearing<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    // the memstore snapshot.  The old snapshot will be returned when we say<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    // 'snapshot', the next time flush comes around.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    // Retry after catching exception when flushing, otherwise server will abort<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    // itself<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    StoreFlusher flusher = storeEngine.getStoreFlusher();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    IOException lastException = null;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    for (int i = 0; i &lt; flushRetriesNumber; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>      try {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        List&lt;Path&gt; pathNames =<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            flusher.flushSnapshot(snapshot, logCacheFlushId, status, throughputController, tracker);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        Path lastPathName = null;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        try {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          for (Path pathName : pathNames) {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>            lastPathName = pathName;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            validateStoreFile(pathName);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>          return pathNames;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        } catch (Exception e) {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>          LOG.warn("Failed validating store file {}, retrying num={}", lastPathName, i, e);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>          if (e instanceof IOException) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>            lastException = (IOException) e;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          } else {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>            lastException = new IOException(e);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>          }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      } catch (IOException e) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        LOG.warn("Failed flushing store file, retrying num={}", i, e);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        lastException = e;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      if (lastException != null &amp;&amp; i &lt; (flushRetriesNumber - 1)) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        try {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          Thread.sleep(pauseTime);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        } catch (InterruptedException e) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          IOException iie = new InterruptedIOException();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          iie.initCause(e);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>          throw iie;<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      }<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    throw lastException;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  /**<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   * @param path The pathname of the tmp file into which the store was flushed<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>   * @param logCacheFlushId<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * @param status<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * @return store file created.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   * @throws IOException<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>   */<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>  private HStoreFile commitFile(Path path, long logCacheFlushId, MonitoredTask status)<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      throws IOException {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    // Write-out finished successfully, move into the right spot<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    Path dstPath = fs.commitStoreFile(getColumnFamilyName(), path);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span><a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    status.setStatus("Flushing " + this + ": reopening flushed file");<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    HStoreFile sf = createStoreFileAndReader(dstPath);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span><a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    StoreFileReader r = sf.getReader();<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    this.storeSize.addAndGet(r.length());<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    if (LOG.isInfoEnabled()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      LOG.info("Added " + sf + ", entries=" + r.getEntries() +<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        ", sequenceid=" + logCacheFlushId +<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ", filesize=" + TraditionalBinaryPrefix.long2String(r.length(), "", 1));<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    return sf;<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>  }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  /**<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>   * @param maxKeyCount<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>   * @param compression Compression algorithm to use<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * @param isCompaction whether we are creating a new file in a compaction<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * @param includeMVCCReadpoint - whether to include MVCC or not<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param includesTag - includesTag or not<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  // TODO : allow the Writer factory to create Writers of ShipperListener type only in case of<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  // compaction<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  public StoreFileWriter createWriterInTmp(long maxKeyCount, Compression.Algorithm compression,<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      boolean isCompaction, boolean includeMVCCReadpoint, boolean includesTag,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      boolean shouldDropBehind) throws IOException {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    final CacheConfig writerCacheConf;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    if (isCompaction) {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // Don't cache data on write on compactions.<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      writerCacheConf = new CacheConfig(cacheConf);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      writerCacheConf.setCacheDataOnWrite(false);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    } else {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      writerCacheConf = cacheConf;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    InetSocketAddress[] favoredNodes = null;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (region.getRegionServerServices() != null) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      favoredNodes = region.getRegionServerServices().getFavoredNodesForRegion(<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          region.getRegionInfo().getEncodedName());<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    HFileContext hFileContext = createFileContext(compression, includeMVCCReadpoint, includesTag,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      cryptoContext);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    Path familyTempDir = new Path(fs.getTempDir(), family.getNameAsString());<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    StoreFileWriter.Builder builder = new StoreFileWriter.Builder(conf, writerCacheConf,<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        this.getFileSystem())<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>            .withOutputDir(familyTempDir)<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>            .withComparator(comparator)<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            .withBloomType(family.getBloomFilterType())<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>            .withMaxKeyCount(maxKeyCount)<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>            .withFavoredNodes(favoredNodes)<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            .withFileContext(hFileContext)<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>            .withShouldDropCacheBehind(shouldDropBehind);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    return builder.build();<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  private HFileContext createFileContext(Compression.Algorithm compression,<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      boolean includeMVCCReadpoint, boolean includesTag, Encryption.Context cryptoContext) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    if (compression == null) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      compression = HFile.DEFAULT_COMPRESSION_ALGORITHM;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    HFileContext hFileContext = new HFileContextBuilder()<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>                                .withIncludesMvcc(includeMVCCReadpoint)<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                                .withIncludesTags(includesTag)<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>                                .withCompression(compression)<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>                                .withCompressTags(family.isCompressTags())<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>                                .withChecksumType(checksumType)<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>                                .withBytesPerCheckSum(bytesPerChecksum)<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>                                .withBlockSize(blocksize)<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>                                .withHBaseCheckSum(true)<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>                                .withDataBlockEncoding(family.getDataBlockEncoding())<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>                                .withEncryptionContext(cryptoContext)<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>                                .withCreateTime(EnvironmentEdgeManager.currentTime())<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>                                .build();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    return hFileContext;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, "<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            + "parallelPutCountPrintThreshold={}, encoding={}, compression={}",<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        getColumnFamilyName(), memstore.getClass().getSimpleName(), policyName, verifyBulkLoads,<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        parallelPutCountPrintThreshold, family.getDataBlockEncoding(),<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        family.getCompressionType());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  /**<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @return MemStore Instance to use in this store.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  private MemStore getMemstore() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    MemStore ms = null;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    if (this.getTableName().isSystemTable()) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    } else {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    if (inMemoryCompaction == null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      inMemoryCompaction =<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    switch (inMemoryCompaction) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      case NONE:<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            new Object[] { conf, this.comparator,<a name="line.355"></a>
+<span class="sourceLineNo">356</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        break;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      default:<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return ms;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * Creates the cache config.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param family The current column family.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>  /**<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * Creates the store engine configured for the given Store.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   *              being passed to coprocessors via the compactor.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @param conf Store configuration.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @return StoreEngine to use.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      CellComparator kvComparator) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return StoreEngine.create(store, conf, comparator);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  /**<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * @param family<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * @return TTL in seconds of the specified family<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    long ttl = family.getTimeToLive();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    if (ttl == HConstants.FOREVER) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      // Default is unlimited ttl.<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      ttl = Long.MAX_VALUE;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    } else if (ttl == -1) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      ttl = Long.MAX_VALUE;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    } else {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      // Second -&gt; ms adjust for user data<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      ttl *= 1000;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span cl

<TRUNCATED>

[16/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.increment

<TRUNCATED>

[34/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 05e90d7..d34d389 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:20181016143408+00'00')
-/CreationDate (D:20181016145043+00'00')
+/ModDate (D:20181017143327+00'00')
+/CreationDate (D:20181017144942+00'00')
 >>
 endobj
 2 0 obj
@@ -24,7 +24,7 @@ endobj
 3 0 obj
 << /Type /Pages
 /Count 787
-/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 46 0 R 49 0 R 52 0 R 56 0 R 63 0 R 65 0 R 69 0 R 71 0 R 73 0 R 80 0 R 83 0 R 85 0 R 91 0 R 94 0 R 96 0 R 98 0 R 105 0 R 112 0 R 117 0 R 119 0 R 135 0 R 140 0 R 148 0 R 157 0 R 165 0 R 169 0 R 178 0 R 189 0 R 193 0 R 195 0 R 199 0 R 208 0 R 217 0 R 225 0 R 234 0 R 239 0 R 248 0 R 256 0 R 265 0 R 278 0 R 285 0 R 295 0 R 303 0 R 311 0 R 318 0 R 327 0 R 333 0 R 339 0 R 346 0 R 354 0 R 362 0 R 373 0 R 386 0 R 394 0 R 401 0 R 409 0 R 417 0 R 426 0 R 436 0 R 444 0 R 451 0 R 458 0 R 467 0 R 480 0 R 488 0 R 495 0 R 503 0 R 511 0 R 520 0 R 525 0 R 531 0 R 536 0 R 540 0 R 556 0 R 567 0 R 571 0 R 586 0 R 591 0 R 596 0 R 598 0 R 600 0 R 603 0 R 605 0 R 607 0 R 615 0 R 621 0 R 624 0 R 628 0 R 637 0 R 648 0 R 656 0 R 660 0 R 664 0 R 666 0 R 676 0 R 691 0 R 698 0 R 709 0 R 719 0 R 730 0 R 742 0 R 762 0 R 777 0 R 784 0 R 791 0 R 797 0 R 800 0 R 804 0 R 808 0 R 811 0 R 814 0 R 816 0 R 819 0 R 823 0 R 825 0 R 829 0 R 835 0 R 840 0 R 
 844 0 R 847 0 R 853 0 R 855 0 R 859 0 R 867 0 R 869 0 R 872 0 R 875 0 R 878 0 R 881 0 R 895 0 R 903 0 R 914 0 R 925 0 R 931 0 R 941 0 R 952 0 R 955 0 R 959 0 R 962 0 R 967 0 R 976 0 R 984 0 R 989 0 R 993 0 R 998 0 R 1002 0 R 1004 0 R 1019 0 R 1030 0 R 1035 0 R 1042 0 R 1045 0 R 1053 0 R 1061 0 R 1066 0 R 1071 0 R 1076 0 R 1078 0 R 1080 0 R 1082 0 R 1092 0 R 1100 0 R 1104 0 R 1111 0 R 1118 0 R 1126 0 R 1130 0 R 1136 0 R 1141 0 R 1149 0 R 1153 0 R 1158 0 R 1160 0 R 1166 0 R 1174 0 R 1180 0 R 1187 0 R 1198 0 R 1202 0 R 1204 0 R 1206 0 R 1210 0 R 1213 0 R 1218 0 R 1221 0 R 1233 0 R 1237 0 R 1243 0 R 1251 0 R 1256 0 R 1260 0 R 1264 0 R 1266 0 R 1269 0 R 1272 0 R 1275 0 R 1279 0 R 1283 0 R 1287 0 R 1292 0 R 1296 0 R 1299 0 R 1301 0 R 1311 0 R 1313 0 R 1318 0 R 1331 0 R 1335 0 R 1341 0 R 1343 0 R 1354 0 R 1357 0 R 1363 0 R 1371 0 R 1374 0 R 1381 0 R 1388 0 R 1391 0 R 1393 0 R 1402 0 R 1404 0 R 1406 0 R 1409 0 R 1411 0 R 1413 0 R 1415 0 R 1417 0 R 1420 0 R 1424 0 R 1429 0 R 1431 0 R 1433 0 
 R 1435 0 R 1440 0 R 1447 0 R 1453 0 R 1456 0 R 1458 0 R 1461 0 R 1465 0 R 1469 0 R 1472 0 R 1474 0 R 1476 0 R 1479 0 R 1484 0 R 1490 0 R 1498 0 R 1512 0 R 1526 0 R 1529 0 R 1534 0 R 1547 0 R 1552 0 R 1567 0 R 1575 0 R 1579 0 R 1588 0 R 1603 0 R 1615 0 R 1618 0 R 1632 0 R 1640 0 R 1645 0 R 1656 0 R 1661 0 R 1667 0 R 1673 0 R 1685 0 R 1688 0 R 1697 0 R 1700 0 R 1709 0 R 1714 0 R 1719 0 R 1723 0 R 1736 0 R 1738 0 R 1744 0 R 1750 0 R 1753 0 R 1761 0 R 1769 0 R 1773 0 R 1775 0 R 1777 0 R 1789 0 R 1795 0 R 1804 0 R 1811 0 R 1824 0 R 1830 0 R 1836 0 R 1847 0 R 1853 0 R 1858 0 R 1862 0 R 1866 0 R 1869 0 R 1874 0 R 1879 0 R 1885 0 R 1890 0 R 1894 0 R 1903 0 R 1909 0 R 1912 0 R 1916 0 R 1925 0 R 1932 0 R 1938 0 R 1945 0 R 1949 0 R 1952 0 R 1957 0 R 1962 0 R 1968 0 R 1970 0 R 1972 0 R 1975 0 R 1986 0 R 1989 0 R 1996 0 R 2004 0 R 2009 0 R 2012 0 R 2017 0 R 2019 0 R 2022 0 R 2027 0 R 2030 0 R 2032 0 R 2035 0 R 2038 0 R 2041 0 R 2051 0 R 2056 0 R 2061 0 R 2063 0 R 2071 0 R 2078 0 R 2085 0 R 2091 
 0 R 2096 0 R 2098 0 R 2107 0 R 2117 0 R 2127 0 R 2133 0 R 2140 0 R 2142 0 R 2147 0 R 2149 0 R 2151 0 R 2155 0 R 2158 0 R 2161 0 R 2166 0 R 2170 0 R 2181 0 R 2184 0 R 2187 0 R 2191 0 R 2195 0 R 2198 0 R 2200 0 R 2205 0 R 2208 0 R 2210 0 R 2215 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2233 0 R 2236 0 R 2238 0 R 2240 0 R 2243 0 R 2245 0 R 2247 0 R 2251 0 R 2256 0 R 2265 0 R 2267 0 R 2269 0 R 2275 0 R 2277 0 R 2282 0 R 2284 0 R 2286 0 R 2293 0 R 2298 0 R 2302 0 R 2307 0 R 2311 0 R 2313 0 R 2315 0 R 2319 0 R 2322 0 R 2324 0 R 2326 0 R 2330 0 R 2332 0 R 2335 0 R 2337 0 R 2339 0 R 2341 0 R 2348 0 R 2351 0 R 2356 0 R 2358 0 R 2360 0 R 2362 0 R 2364 0 R 2372 0 R 2383 0 R 2397 0 R 2408 0 R 2412 0 R 2417 0 R 2421 0 R 2424 0 R 2429 0 R 2435 0 R 2437 0 R 2440 0 R 2442 0 R 2444 0 R 2446 0 R 2451 0 R 2453 0 R 2466 0 R 2469 0 R 2477 0 R 2483 0 R 2495 0 R 2509 0 R 2522 0 R 2541 0 R 2543 0 R 2545 0 R 2549 0 R 2567 0 R 2573 0 R 2585 0 R 2589 0 R 2593 0 R 2602 0 R 2614 0 R 2619 0 R 2629 0 R 2642 0 R 266
 1 0 R 2670 0 R 2673 0 R 2682 0 R 2699 0 R 2706 0 R 2709 0 R 2714 0 R 2718 0 R 2721 0 R 2730 0 R 2739 0 R 2742 0 R 2744 0 R 2748 0 R 2762 0 R 2771 0 R 2776 0 R 2780 0 R 2783 0 R 2785 0 R 2787 0 R 2789 0 R 2794 0 R 2807 0 R 2817 0 R 2825 0 R 2832 0 R 2837 0 R 2847 0 R 2854 0 R 2860 0 R 2862 0 R 2871 0 R 2879 0 R 2881 0 R 2885 0 R 2887 0 R 2898 0 R 2904 0 R 2906 0 R 2915 0 R 2918 0 R 2928 0 R 2932 0 R 2941 0 R 2949 0 R 2954 0 R 2958 0 R 2962 0 R 2964 0 R 2970 0 R 2974 0 R 2978 0 R 2984 0 R 2990 0 R 2993 0 R 2999 0 R 3003 0 R 3012 0 R 3017 0 R 3023 0 R 3033 0 R 3040 0 R 3047 0 R 3050 0 R 3053 0 R 3060 0 R 3065 0 R 3068 0 R 3073 0 R 3083 0 R 3088 0 R 3090 0 R 3094 0 R 3099 0 R 3104 0 R 3111 0 R 3118 0 R 3125 0 R 3133 0 R 3139 0 R 3144 0 R 3148 0 R 3151 0 R 3154 0 R 3163 0 R 3168 0 R 3172 0 R 3180 0 R 3185 0 R 3189 0 R 3191 0 R 3202 0 R 3207 0 R 3210 0 R 3212 0 R 3214 0 R 3224 0 R 3231 0 R 3235 0 R 3238 0 R 3245 0 R 3249 0 R 3252 0 R 3256 0 R 3261 0 R 3269 0 R 3274 0 R 3279 0 R 3284 0 R 3
 286 0 R 3289 0 R 3291 0 R 3295 0 R 3306 0 R 3308 0 R 3312 0 R 3315 0 R 3319 0 R 3322 0 R 3326 0 R 3328 0 R 3341 0 R 3346 0 R 3351 0 R 3357 0 R 3365 0 R 3367 0 R 3375 0 R 3393 0 R 3405 0 R 3411 0 R 3427 0 R 3431 0 R 3436 0 R 3438 0 R 3445 0 R 3448 0 R 3453 0 R 3456 0 R 3458 0 R 3460 0 R 3462 0 R 3466 0 R 3484 0 R 3487 0 R 3492 0 R 3498 0 R 3508 0 R 3513 0 R 3523 0 R 3534 0 R 3541 0 R 3546 0 R 3553 0 R 3558 0 R 3561 0 R 3569 0 R 3573 0 R 3578 0 R 3583 0 R 3596 0 R 3599 0 R 3605 0 R 3611 0 R 3616 0 R 3626 0 R 3635 0 R 3641 0 R 3650 0 R 3659 0 R 3664 0 R 3670 0 R 3676 0 R 3681 0 R 3683 0 R 3689 0 R 3696 0 R 3698 0 R 3706 0 R 3708 0 R 3714 0 R 3722 0 R 3728 0 R 3737 0 R 3743 0 R 3754 0 R 3763 0 R 3775 0 R 3785 0 R 3796 0 R 3800 0 R 3802 0 R 3806 0 R 3819 0 R 3825 0 R 3830 0 R 3836 0 R 3840 0 R 3843 0 R 3848 0 R 3850 0 R 3854 0 R 3856 0 R 3860 0 R 3863 0 R 3866 0 R 3874 0 R 3876 0 R 3882 0 R 3885 0 R 3891 0 R 3895 0 R 3898 0 R 3901 0 R 3904 0 R 3908 0 R 3911 0 R 3916 0 R 3921 0 R 3924 0 R
  3932 0 R 3936 0 R 3940 0 R 3942 0 R 3945 0 R 3948 0 R 3953 0 R 3960 0 R 3966 0 R 3970 0 R 3973 0 R 3980 0 R 3988 0 R 3992 0 R 3995 0 R 3997 0 R 4001 0 R 4006 0 R 4011 0 R 4014 0 R 4023 0 R 4028 0 R 4032 0 R 4035 0 R 4043 0 R 4048 0 R 4056 0 R 4061 0 R 4063 0 R 4069 0 R 4071 0 R 4076 0 R 4080 0 R 4085 0 R 4089 0 R 4101 0 R 4117 0 R 4132 0 R 4137 0 R 4140 0 R 4143 0 R 4149 0 R 4154 0 R 4156 0 R 4158 0 R 4160 0 R 4162 0 R 4164 0 R 4173 0 R 4177 0 R 4181 0 R 4185 0 R 4187 0 R 4194 0 R 4204 0 R 4211 0 R 4214 0 R 4217 0 R 4219 0 R 4226 0 R 4233 0 R 4244 0 R 4248 0 R 4251 0 R 4255 0 R 4258 0 R 4264 0 R 4267 0 R 4282 0 R 4287 0 R 4310 0 R 4314 0 R 4321 0 R 4332 0 R 4341 0 R 4344 0 R 4347 0 R 4350 0 R 4366 0 R 4371 0 R 4378 0 R 4381 0 R 4384 0 R 4391 0 R 4396 0 R 4400 0 R 4402 0 R 4408 0 R 4415 0 R 4423 0 R 4427 0 R 4432 0 R 4437 0 R 4443 0 R 4450 0 R 4457 0 R 4463 0 R 4471 0 R 4479 0 R 4483 0 R 4492 0 R 4500 0 R 4506 0 R]
+/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 46 0 R 49 0 R 52 0 R 56 0 R 63 0 R 65 0 R 69 0 R 71 0 R 73 0 R 80 0 R 83 0 R 85 0 R 91 0 R 94 0 R 96 0 R 98 0 R 105 0 R 112 0 R 117 0 R 119 0 R 135 0 R 140 0 R 148 0 R 157 0 R 165 0 R 169 0 R 178 0 R 189 0 R 193 0 R 195 0 R 199 0 R 208 0 R 217 0 R 225 0 R 234 0 R 239 0 R 248 0 R 256 0 R 265 0 R 278 0 R 285 0 R 295 0 R 303 0 R 311 0 R 318 0 R 327 0 R 333 0 R 339 0 R 346 0 R 354 0 R 362 0 R 373 0 R 386 0 R 394 0 R 401 0 R 409 0 R 417 0 R 426 0 R 436 0 R 444 0 R 451 0 R 458 0 R 467 0 R 480 0 R 488 0 R 495 0 R 503 0 R 511 0 R 520 0 R 525 0 R 531 0 R 536 0 R 540 0 R 556 0 R 567 0 R 571 0 R 586 0 R 591 0 R 596 0 R 598 0 R 600 0 R 603 0 R 605 0 R 607 0 R 615 0 R 621 0 R 624 0 R 628 0 R 637 0 R 648 0 R 656 0 R 660 0 R 664 0 R 666 0 R 676 0 R 691 0 R 698 0 R 709 0 R 719 0 R 730 0 R 742 0 R 762 0 R 777 0 R 784 0 R 791 0 R 797 0 R 800 0 R 804 0 R 808 0 R 811 0 R 814 0 R 816 0 R 819 0 R 823 0 R 825 0 R 829 0 R 835 0 R 840 0 R 
 844 0 R 847 0 R 853 0 R 855 0 R 859 0 R 867 0 R 869 0 R 872 0 R 875 0 R 878 0 R 881 0 R 895 0 R 903 0 R 914 0 R 925 0 R 931 0 R 941 0 R 952 0 R 955 0 R 959 0 R 962 0 R 967 0 R 976 0 R 984 0 R 989 0 R 993 0 R 998 0 R 1002 0 R 1004 0 R 1019 0 R 1030 0 R 1035 0 R 1042 0 R 1045 0 R 1053 0 R 1061 0 R 1066 0 R 1071 0 R 1076 0 R 1078 0 R 1080 0 R 1082 0 R 1092 0 R 1100 0 R 1104 0 R 1111 0 R 1118 0 R 1126 0 R 1130 0 R 1136 0 R 1141 0 R 1149 0 R 1153 0 R 1158 0 R 1160 0 R 1166 0 R 1174 0 R 1180 0 R 1187 0 R 1198 0 R 1202 0 R 1204 0 R 1206 0 R 1210 0 R 1213 0 R 1218 0 R 1221 0 R 1233 0 R 1237 0 R 1243 0 R 1251 0 R 1256 0 R 1260 0 R 1264 0 R 1266 0 R 1269 0 R 1272 0 R 1275 0 R 1279 0 R 1283 0 R 1287 0 R 1292 0 R 1296 0 R 1299 0 R 1301 0 R 1311 0 R 1313 0 R 1318 0 R 1331 0 R 1335 0 R 1341 0 R 1343 0 R 1354 0 R 1357 0 R 1363 0 R 1371 0 R 1374 0 R 1381 0 R 1388 0 R 1391 0 R 1393 0 R 1402 0 R 1404 0 R 1406 0 R 1409 0 R 1411 0 R 1413 0 R 1415 0 R 1417 0 R 1420 0 R 1424 0 R 1429 0 R 1431 0 R 1433 0 
 R 1435 0 R 1440 0 R 1447 0 R 1453 0 R 1456 0 R 1458 0 R 1461 0 R 1465 0 R 1469 0 R 1472 0 R 1474 0 R 1476 0 R 1479 0 R 1484 0 R 1490 0 R 1498 0 R 1512 0 R 1526 0 R 1529 0 R 1534 0 R 1547 0 R 1552 0 R 1567 0 R 1575 0 R 1579 0 R 1588 0 R 1603 0 R 1615 0 R 1618 0 R 1632 0 R 1640 0 R 1645 0 R 1656 0 R 1661 0 R 1667 0 R 1673 0 R 1685 0 R 1688 0 R 1697 0 R 1700 0 R 1709 0 R 1714 0 R 1719 0 R 1723 0 R 1736 0 R 1738 0 R 1744 0 R 1750 0 R 1753 0 R 1761 0 R 1769 0 R 1773 0 R 1775 0 R 1777 0 R 1789 0 R 1795 0 R 1804 0 R 1811 0 R 1824 0 R 1830 0 R 1836 0 R 1847 0 R 1853 0 R 1858 0 R 1862 0 R 1866 0 R 1869 0 R 1874 0 R 1879 0 R 1885 0 R 1890 0 R 1894 0 R 1903 0 R 1909 0 R 1912 0 R 1916 0 R 1925 0 R 1932 0 R 1938 0 R 1945 0 R 1949 0 R 1952 0 R 1957 0 R 1962 0 R 1968 0 R 1970 0 R 1972 0 R 1975 0 R 1986 0 R 1989 0 R 1996 0 R 2004 0 R 2009 0 R 2012 0 R 2017 0 R 2019 0 R 2022 0 R 2027 0 R 2030 0 R 2032 0 R 2035 0 R 2038 0 R 2041 0 R 2051 0 R 2056 0 R 2061 0 R 2063 0 R 2071 0 R 2078 0 R 2085 0 R 2091 
 0 R 2096 0 R 2098 0 R 2107 0 R 2117 0 R 2127 0 R 2133 0 R 2140 0 R 2142 0 R 2147 0 R 2149 0 R 2151 0 R 2155 0 R 2158 0 R 2161 0 R 2166 0 R 2170 0 R 2181 0 R 2184 0 R 2187 0 R 2191 0 R 2195 0 R 2198 0 R 2200 0 R 2205 0 R 2208 0 R 2210 0 R 2215 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2233 0 R 2236 0 R 2238 0 R 2240 0 R 2243 0 R 2245 0 R 2247 0 R 2251 0 R 2256 0 R 2265 0 R 2267 0 R 2269 0 R 2275 0 R 2277 0 R 2282 0 R 2284 0 R 2286 0 R 2293 0 R 2298 0 R 2302 0 R 2307 0 R 2311 0 R 2313 0 R 2315 0 R 2319 0 R 2322 0 R 2324 0 R 2326 0 R 2330 0 R 2332 0 R 2335 0 R 2337 0 R 2339 0 R 2341 0 R 2348 0 R 2351 0 R 2356 0 R 2358 0 R 2360 0 R 2362 0 R 2364 0 R 2372 0 R 2383 0 R 2397 0 R 2408 0 R 2412 0 R 2417 0 R 2421 0 R 2424 0 R 2429 0 R 2435 0 R 2437 0 R 2440 0 R 2442 0 R 2444 0 R 2446 0 R 2451 0 R 2453 0 R 2466 0 R 2469 0 R 2477 0 R 2483 0 R 2495 0 R 2509 0 R 2522 0 R 2541 0 R 2543 0 R 2545 0 R 2549 0 R 2567 0 R 2573 0 R 2585 0 R 2589 0 R 2593 0 R 2602 0 R 2614 0 R 2619 0 R 2629 0 R 2642 0 R 266
 1 0 R 2670 0 R 2673 0 R 2682 0 R 2699 0 R 2706 0 R 2709 0 R 2714 0 R 2718 0 R 2721 0 R 2730 0 R 2739 0 R 2742 0 R 2744 0 R 2748 0 R 2762 0 R 2771 0 R 2776 0 R 2780 0 R 2783 0 R 2785 0 R 2787 0 R 2789 0 R 2794 0 R 2807 0 R 2817 0 R 2825 0 R 2832 0 R 2837 0 R 2847 0 R 2854 0 R 2860 0 R 2862 0 R 2871 0 R 2879 0 R 2881 0 R 2885 0 R 2887 0 R 2898 0 R 2904 0 R 2906 0 R 2915 0 R 2918 0 R 2928 0 R 2932 0 R 2941 0 R 2949 0 R 2954 0 R 2958 0 R 2962 0 R 2964 0 R 2970 0 R 2974 0 R 2978 0 R 2984 0 R 2990 0 R 2993 0 R 2999 0 R 3003 0 R 3012 0 R 3017 0 R 3023 0 R 3033 0 R 3040 0 R 3047 0 R 3050 0 R 3053 0 R 3059 0 R 3065 0 R 3068 0 R 3073 0 R 3082 0 R 3088 0 R 3090 0 R 3094 0 R 3099 0 R 3104 0 R 3111 0 R 3118 0 R 3125 0 R 3133 0 R 3139 0 R 3144 0 R 3148 0 R 3151 0 R 3154 0 R 3163 0 R 3168 0 R 3172 0 R 3180 0 R 3185 0 R 3189 0 R 3191 0 R 3202 0 R 3207 0 R 3210 0 R 3212 0 R 3214 0 R 3224 0 R 3231 0 R 3235 0 R 3238 0 R 3245 0 R 3249 0 R 3252 0 R 3256 0 R 3261 0 R 3269 0 R 3274 0 R 3279 0 R 3284 0 R 3
 286 0 R 3289 0 R 3291 0 R 3295 0 R 3306 0 R 3308 0 R 3312 0 R 3315 0 R 3319 0 R 3322 0 R 3326 0 R 3328 0 R 3341 0 R 3346 0 R 3351 0 R 3357 0 R 3365 0 R 3367 0 R 3375 0 R 3393 0 R 3405 0 R 3411 0 R 3427 0 R 3431 0 R 3436 0 R 3438 0 R 3445 0 R 3448 0 R 3453 0 R 3456 0 R 3458 0 R 3460 0 R 3462 0 R 3466 0 R 3484 0 R 3487 0 R 3492 0 R 3498 0 R 3508 0 R 3513 0 R 3523 0 R 3534 0 R 3541 0 R 3546 0 R 3553 0 R 3558 0 R 3561 0 R 3569 0 R 3573 0 R 3578 0 R 3583 0 R 3596 0 R 3599 0 R 3605 0 R 3611 0 R 3616 0 R 3626 0 R 3635 0 R 3641 0 R 3650 0 R 3659 0 R 3664 0 R 3670 0 R 3676 0 R 3681 0 R 3683 0 R 3689 0 R 3696 0 R 3698 0 R 3706 0 R 3708 0 R 3714 0 R 3722 0 R 3728 0 R 3737 0 R 3743 0 R 3754 0 R 3763 0 R 3775 0 R 3785 0 R 3796 0 R 3800 0 R 3802 0 R 3806 0 R 3819 0 R 3825 0 R 3830 0 R 3836 0 R 3840 0 R 3843 0 R 3848 0 R 3850 0 R 3854 0 R 3856 0 R 3860 0 R 3863 0 R 3866 0 R 3874 0 R 3876 0 R 3882 0 R 3885 0 R 3891 0 R 3895 0 R 3898 0 R 3901 0 R 3904 0 R 3908 0 R 3911 0 R 3916 0 R 3921 0 R 3924 0 R
  3932 0 R 3936 0 R 3940 0 R 3942 0 R 3945 0 R 3948 0 R 3953 0 R 3960 0 R 3966 0 R 3970 0 R 3973 0 R 3980 0 R 3988 0 R 3992 0 R 3995 0 R 3997 0 R 4001 0 R 4006 0 R 4011 0 R 4014 0 R 4023 0 R 4028 0 R 4032 0 R 4035 0 R 4043 0 R 4048 0 R 4056 0 R 4061 0 R 4063 0 R 4069 0 R 4071 0 R 4076 0 R 4080 0 R 4085 0 R 4089 0 R 4101 0 R 4117 0 R 4132 0 R 4137 0 R 4140 0 R 4143 0 R 4149 0 R 4154 0 R 4156 0 R 4158 0 R 4160 0 R 4162 0 R 4164 0 R 4173 0 R 4177 0 R 4181 0 R 4185 0 R 4187 0 R 4194 0 R 4204 0 R 4211 0 R 4214 0 R 4217 0 R 4219 0 R 4226 0 R 4233 0 R 4244 0 R 4248 0 R 4251 0 R 4255 0 R 4258 0 R 4264 0 R 4267 0 R 4282 0 R 4287 0 R 4310 0 R 4314 0 R 4321 0 R 4332 0 R 4341 0 R 4344 0 R 4347 0 R 4350 0 R 4366 0 R 4371 0 R 4378 0 R 4381 0 R 4384 0 R 4391 0 R 4396 0 R 4400 0 R 4402 0 R 4408 0 R 4415 0 R 4423 0 R 4427 0 R 4432 0 R 4437 0 R 4443 0 R 4450 0 R 4457 0 R 4463 0 R 4471 0 R 4479 0 R 4483 0 R 4492 0 R 4500 0 R 4506 0 R]
 >>
 endobj
 4 0 obj
@@ -117494,7 +117494,7 @@ endobj
 endobj
 909 0 obj
 << /Limits [(rowcounter) (save-the-dataframe)]
-/Names [(rowcounter) 3119 0 R (rowcounter-example) 1238 0 R (rowkey.design) 999 0 R (rowkey.regionsplits) 1040 0 R (rowkey.scope) 1037 0 R (rpc) 4360 0 R (rpc.configs) 4379 0 R (rpc.logging) 2737 0 R (rpcscheduler-dispatch-callrunner-p1-abstract-void-1) 4417 0 R (rs.failover.details) 3282 0 R (rs_metrics) 3208 0 R (rsgroup) 3432 0 R (run-canary-test-as-daemon-mode) 3057 0 R (run.insitu) 3741 0 R (running-canary-in-a-kerberos-enabled-cluster) 3063 0 R (running-hbck-to-identify-inconsistencies) 4134 0 R (running-multiple-workloads-on-a-single-cluster) 3296 0 R (running-the-shell-in-non-interactive-mode) 801 0 R (save-the-dataframe) 2346 0 R]
+/Names [(rowcounter) 3119 0 R (rowcounter-example) 1238 0 R (rowkey.design) 999 0 R (rowkey.regionsplits) 1040 0 R (rowkey.scope) 1037 0 R (rpc) 4360 0 R (rpc.configs) 4379 0 R (rpc.logging) 2737 0 R (rpcscheduler-dispatch-callrunner-p1-abstract-void-1) 4417 0 R (rs.failover.details) 3282 0 R (rs_metrics) 3208 0 R (rsgroup) 3432 0 R (run-canary-test-as-a-daemon) 3057 0 R (run.insitu) 3741 0 R (running-canary-in-a-kerberos-enabled-cluster) 3063 0 R (running-hbck-to-identify-inconsistencies) 4134 0 R (running-multiple-workloads-on-a-single-cluster) 3296 0 R (running-the-shell-in-non-interactive-mode) 801 0 R (save-the-dataframe) 2346 0 R]
 >>
 endobj
 910 0 obj
@@ -440256,7 +440256,7 @@ endobj
 endobj
 2305 0 obj
 << /Limits [(exploringcompaction.policy) (force-timeout-if-canary-test-stuck)]
-/Names [(exploringcompaction.policy) 1849 0 R (export) 3092 0 R (external-zookeeper-configuration) 3993 0 R (external_apis) 2211 0 R (faq) 4090 0 R (file-info-format-in-versions-1-and-2) 4261 0 R (filter-api-changes) 4466 0 R (fix-target-cached_classpath-txt) 4004 0 R (fixed-file-trailer-format-differences-between-versions-1-and-2) 4262 0 R (fixing-prefix_tree-errors) 3146 0 R (for-applications-that-can-tolerate-slightly-out-of-date-information) 1183 0 R (for-applications-where-failing-quickly-is-better-than-waiting) 1182 0 R (force-timeout-if-canary-test-stuck) 3058 0 R]
+/Names [(exploringcompaction.policy) 1849 0 R (export) 3092 0 R (external-zookeeper-configuration) 3993 0 R (external_apis) 2211 0 R (faq) 4090 0 R (file-info-format-in-versions-1-and-2) 4261 0 R (filter-api-changes) 4466 0 R (fix-target-cached_classpath-txt) 4004 0 R (fixed-file-trailer-format-differences-between-versions-1-and-2) 4262 0 R (fixing-prefix_tree-errors) 3146 0 R (for-applications-that-can-tolerate-slightly-out-of-date-information) 1183 0 R (for-applications-where-failing-quickly-is-better-than-waiting) 1182 0 R (force-timeout-if-canary-test-stuck) 3060 0 R]
 >>
 endobj
 2306 0 obj
@@ -603079,7 +603079,7 @@ endobj
 >>
 endobj
 3046 0 obj
-<< /Length 11326
+<< /Length 11660
 >>
 stream
 q
@@ -603099,12 +603099,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.937 Tw
+1.4121 Tw
 
 BT
 48.24 758.646 Td
 /F1.0 10.5 Tf
-<546865726520697320612043616e61727920636c6173732063616e2068656c7020757365727320746f2063616e6172792d746573742074686520484261736520636c7573746572207374617475732c207769746820657665727920636f6c756d6e2d> Tj
+<5468652043616e61727920746f6f6c2063616e2068656c70207573657273202263616e6172792d74657374222074686520484261736520636c7573746572207374617475732e205468652064656661756c742022726567696f6e206d6f646522> Tj
 ET
 
 
@@ -603114,114 +603114,134 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.7281 Tw
+
 BT
 48.24 742.866 Td
 /F1.0 10.5 Tf
-[<66616d696c7920666f7220657665727920726567696f6e73206f7220526567696f6e536572766572> -29.7852 <d573206772> 20.0195 <616e756c6172697479> 89.8438 <2e2054> 29.7852 <6f20736565207468652075736167652c207573652074686520>] TJ
+<66657463686573206120726f772066726f6d20657665727920636f6c756d6e2d66616d696c79206f6620657665727920726567696f6e732e20496e2022726567696f6e736572766572206d6f6465222c207468652043616e61727920746f6f6c> Tj
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+0.1647 Tw
 
 BT
-448.6484 742.866 Td
-/F4.0 10.5 Tf
-<2d68656c70> Tj
+48.24 727.086 Td
+/F1.0 10.5 Tf
+[<77696c6c206665746368206120726f772066726f6d20612072> 20.0195 <616e646f6d20726567696f6e206f6e2065616368206f662074686520636c7573746572> -29.7852 <d57320526567696f6e536572766572732e20496e20227a6f6f6b> 20.0195 <6565706572206d6f6465222c>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-474.8984 742.866 Td
+48.24 711.306 Td
 /F1.0 10.5 Tf
-[<20706172> 20.0195 <616d657465722e>] TJ
+[<7468652043616e6172792077696c6c20726561642074686520726f6f74207a6e6f6465206f6e2065616368206d656d626572206f6620746865207a6f6f6b> 20.0195 <656570657220656e73656d626c652e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-q
-0.9608 0.9608 0.9608 scn
-52.24 727.05 m
-543.04 727.05 l
-545.2491 727.05 547.04 725.2591 547.04 723.05 c
-547.04 296.33 l
-547.04 294.1209 545.2491 292.33 543.04 292.33 c
-52.24 292.33 l
-50.0309 292.33 48.24 294.1209 48.24 296.33 c
-48.24 723.05 l
-48.24 725.2591 50.0309 727.05 52.24 727.05 c
-h
-f
-0.8 0.8 0.8 SCN
-0.75 w
-52.24 727.05 m
-543.04 727.05 l
-545.2491 727.05 547.04 725.2591 547.04 723.05 c
-547.04 296.33 l
-547.04 294.1209 545.2491 292.33 543.04 292.33 c
-52.24 292.33 l
-50.0309 292.33 48.24 294.1209 48.24 296.33 c
-48.24 723.05 l
-48.24 725.2591 50.0309 727.05 52.24 727.05 c
-h
-S
-Q
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.4808 Tw
+
 BT
-59.24 704.225 Td
-/F4.0 11 Tf
-<2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d68656c70> Tj
+48.24 683.526 Td
+/F1.0 10.5 Tf
+[<54> 29.7852 <6f207365652075736167652c20706173732074686520>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
+
+0.4808 Tw
 
 BT
-59.24 674.745 Td
-/F4.0 11 Tf
-<55736167653a2068626173652063616e617279205b6f7074735d205b7461626c6531205b7461626c65325d2e2e2e5d207c205b726567696f6e73657276657231205b726567696f6e736572766572325d2e2e5d> Tj
+161.3476 683.526 Td
+/F4.0 10.5 Tf
+<2d68656c70> Tj
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.4808 Tw
+
 BT
-59.24 660.005 Td
-/F4.0 11 Tf
-<ca7768657265205b6f7074735d206172653a> Tj
+187.5976 683.526 Td
+/F1.0 10.5 Tf
+[<20706172> 20.0195 <616d657465722028696620796f752070617373206e6f20706172> 20.0195 <616d65746572732c207468652043616e61727920746f6f6c2073746172747320657865637574696e67>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-59.24 645.265 Td
-/F4.0 11 Tf
-<ca20202d68656c702020202020202020202053686f7720746869732068656c7020616e6420657869742e> Tj
+48.24 667.746 Td
+/F1.0 10.5 Tf
+<696e207468652064656661756c7420726567696f6e20226d6f646522206665746368696e67206120726f772066726f6d20657665727920726567696f6e20696e2074686520636c7573746572292e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
+q
+0.9608 0.9608 0.9608 scn
+52.24 651.93 m
+543.04 651.93 l
+545.2491 651.93 547.04 650.1391 547.04 647.93 c
+547.04 162.25 l
+547.04 160.0409 545.2491 158.25 543.04 158.25 c
+52.24 158.25 l
+50.0309 158.25 48.24 160.0409 48.24 162.25 c
+48.24 647.93 l
+48.24 650.1391 50.0309 651.93 52.24 651.93 c
+h
+f
+0.8 0.8 0.8 SCN
+0.75 w
+52.24 651.93 m
+543.04 651.93 l
+545.2491 651.93 547.04 650.1391 547.04 647.93 c
+547.04 162.25 l
+547.04 160.0409 545.2491 158.25 543.04 158.25 c
+52.24 158.25 l
+50.0309 158.25 48.24 160.0409 48.24 162.25 c
+48.24 647.93 l
+48.24 650.1391 50.0309 651.93 52.24 651.93 c
+h
+S
+Q
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-59.24 630.525 Td
+59.24 629.105 Td
 /F4.0 11 Tf
-<ca20202d726567696f6e73657276657220207265706c61636520746865207461626c6520617267756d656e7420746f20726567696f6e7365727665722c> Tj
+<323031382d31302d31362031333a31313a32372c30333720494e464f20205b6d61696e5d20746f6f6c2e43616e6172793a20457865637574696f6e2074687265616420636f756e743d3136> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603230,9 +603250,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 615.785 Td
+59.24 614.365 Td
 /F4.0 11 Tf
-<ca20202020207768696368206d65616e7320746f20656e61626c6520726567696f6e736572766572206d6f6465> Tj
+<55736167653a2063616e617279205b4f5054494f4e535d205b3c5441424c45313e205b3c5441424c45325d2e2e2e5d207c205b3c524547494f4e534552564552313e205b3c524547494f4e534552564552325d2e2e5d> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603241,9 +603261,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 601.045 Td
+59.24 599.625 Td
 /F4.0 11 Tf
-<ca20202d616c6c526567696f6e7320202020547269657320616c6c20726567696f6e73206f6e206120726567696f6e7365727665722c> Tj
+<5768657265205b4f5054494f4e535d206172653a> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603252,9 +603272,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 586.305 Td
+59.24 584.885 Td
 /F4.0 11 Tf
-<ca20202020206f6e6c7920776f726b7320696e20726567696f6e736572766572206d6f64652e> Tj
+<ca2d682c2d68656c70202020202020202073686f7720746869732068656c7020616e6420657869742e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603263,9 +603283,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 571.565 Td
+59.24 570.145 Td
 /F4.0 11 Tf
-<ca20202d7a6f6f6b656570657220202020547269657320746f2067726162207a6f6f6b65657065722e7a6e6f64652e706172656e74> Tj
+<ca2d726567696f6e7365727665722020207365742027726567696f6e736572766572206d6f6465273b206765747320726f772066726f6d2072616e646f6d20726567696f6e206f6e20736572766572> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603274,9 +603294,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 556.825 Td
+59.24 555.405 Td
 /F4.0 11 Tf
-<ca20202020206f6e2065616368207a6f6f6b656570657220696e7374616e6365> Tj
+<ca2d616c6c526567696f6e7320202020206765742066726f6d20414c4c20726567696f6e73207768656e2027726567696f6e736572766572206d6f6465272c206e6f74206a7573742072616e646f6d206f6e652e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603285,9 +603305,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 542.085 Td
+59.24 540.665 Td
 /F4.0 11 Tf
-<ca20202d6461656d6f6e2020202020202020436f6e74696e756f757320636865636b20617420646566696e656420696e74657276616c732e> Tj
+<ca2d7a6f6f6b656570657220202020202073657420277a6f6f6b6565706572206d6f6465273b2067726162207a6f6f6b65657065722e7a6e6f64652e706172656e74206f6e206561636820656e73656d626c65> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603296,9 +603316,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 527.345 Td
+59.24 525.925 Td
 /F4.0 11 Tf
-<ca20202d696e74657276616c203c4e3e2020496e74657276616c206265747765656e20636865636b73202873656329> Tj
+<6d656d626572> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603307,9 +603327,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 512.605 Td
+59.24 511.185 Td
 /F4.0 11 Tf
-<ca20202d6520202020202020202020202020557365207461626c652f726567696f6e73657276657220617320726567756c61722065787072657373696f6e> Tj
+<ca2d6461656d6f6e202020202020202020636f6e74696e756f757320636865636b20617420646566696e656420696e74657276616c732e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603318,9 +603338,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 497.865 Td
+59.24 496.445 Td
 /F4.0 11 Tf
-<ca20202020207768696368206d65616e7320746865207461626c652f726567696f6e73657276657220697320726567756c61722065787072657373696f6e207061747465726e> Tj
+<ca2d696e74657276616c203c4e3e202020696e74657276616c206265747765656e20636865636b7320696e207365636f6e6473> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603329,9 +603349,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 483.125 Td
+59.24 481.705 Td
 /F4.0 11 Tf
-<ca20202d66203c423e20202020202020202073746f702077686f6c652070726f6772616d206966206669727374206572726f72206f63637572732c2064656661756c742069732074727565> Tj
+<ca2d652020202020202020202020202020636f6e7369646572207461626c652f726567696f6e73657276657220617267756d656e7420617320726567756c61722065787072657373696f6e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603340,9 +603360,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 468.385 Td
+59.24 466.965 Td
 /F4.0 11 Tf
-<ca20202d74203c4e3e20202020202020202074696d656f757420666f72206120636865636b2c2064656661756c742069732036303030303020286d696c6c697365637329> Tj
+<ca2d66203c423e2020202020202020202065786974206f6e206669727374206572726f723b2064656661756c743d74727565> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603351,9 +603371,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 453.645 Td
+59.24 452.225 Td
 /F4.0 11 Tf
-<ca20202d77726974655461626c6554696d656f7574203c4e3e20202020202020202077726974652074696d656f757420666f72207468652077726974655461626c652c2064656661756c7420697320363030303030> Tj
+<ca2d6661696c75726541734572726f7220747265617420726561642f7772697465206661696c757265206173206572726f72> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603362,9 +603382,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 438.905 Td
+59.24 437.485 Td
 /F4.0 11 Tf
-<286d696c6c697365637329> Tj
+<ca2d74203c4e3e2020202020202020202074696d656f757420666f722063616e6172792d746573742072756e3b2064656661756c743d3630303030306d73> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603373,9 +603393,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 424.165 Td
+59.24 422.745 Td
 /F4.0 11 Tf
-<ca20202d726561645461626c6554696d656f757473203c7461626c654e616d653e3d3c726561642074696d656f75743e2c3c7461626c654e616d653e3d3c726561642074696d656f75743e2c202e2e2e> Tj
+<ca2d7772697465536e696666696e672020656e61626c6520777269746520736e696666696e67> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603384,9 +603404,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 409.425 Td
+59.24 408.005 Td
 /F4.0 11 Tf
-<636f6d6d612d736570617261746564206c697374206f6620726561642074696d656f75747320706572207461626c6520286e6f20737061636573292c2064656661756c7420697320363030303030> Tj
+<ca2d77726974655461626c652020202020746865207461626c65207573656420666f7220777269746520736e696666696e673b2064656661756c743d68626173653a63616e617279> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603395,9 +603415,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 394.685 Td
+59.24 393.265 Td
 /F4.0 11 Tf
-<286d696c6c697365637329> Tj
+<ca2d77726974655461626c6554696d656f7574203c4e3e202074696d656f757420666f722077726974655461626c653b2064656661756c743d3630303030306d73> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603406,9 +603426,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 379.945 Td
+59.24 378.525 Td
 /F4.0 11 Tf
-<ca20202d7772697465536e696666696e6720656e61626c652074686520777269746520736e696666696e6720696e2063616e617279> Tj
+<ca2d726561645461626c6554696d656f757473203c7461626c654e616d653e3d3c726561642074696d656f75743e2c3c7461626c654e616d653e3d3c726561642074696d656f75743e2c2e2e2e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603417,9 +603437,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 365.205 Td
+59.24 363.785 Td
 /F4.0 11 Tf
-<ca20202d74726561744661696c75726541734572726f72207472656174732072656164202f207772697465206661696c757265206173206572726f72> Tj
+<ca202020202020202020202020202020636f6d6d612d736570617261746564206c697374206f66207461626c6520726561642074696d656f75747320286e6f20737061636573293b> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603428,9 +603448,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 350.465 Td
+59.24 349.045 Td
 /F4.0 11 Tf
-<ca20202d77726974655461626c6520202020546865207461626c65207573656420666f7220777269746520736e696666696e672e2044656661756c742069732068626173653a63616e617279> Tj
+<ca2020202020202020202020202020206c6f677320274552524f52272069662074616b6573206c6f6e6765722e2064656661756c743d3630303030306d73> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603439,9 +603459,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 335.725 Td
+59.24 334.305 Td
 /F4.0 11 Tf
-<ca20202d4468626173652e63616e6172792e726561642e7261772e656e61626c65643d3c747275652f66616c73653e20557365207468697320666c616720746f20656e61626c65206f722064697361626c6520726177> Tj
+<ca2d7065726d69747465645a6f6f6b65657065724661696c75726573203c4e3e202049676e6f7265206669727374204e206661696c7572657320617474656d7074696e6720746f> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603450,9 +603470,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 320.985 Td
+59.24 319.565 Td
 /F4.0 11 Tf
-<7363616e20647572696e6720726561642063616e61727920746573742044656661756c742069732066616c736520616e6420726177206973206e6f7420656e61626c656420647572696e67207363616e> Tj
+<ca202020202020202020202020202020636f6e6e65637420746f20696e646976696475616c207a6f6f6b6565706572206e6f64657320696e20656e73656d626c65> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603461,27 +603481,20 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 306.245 Td
+59.24 290.085 Td
 /F4.0 11 Tf
-<ca20202d443c636f6e66696750726f70657274793e3d3c76616c75653e2061737369676e696e67206f72206f766572726964652074686520636f6e66696775726174696f6e20706172616d73> Tj
+<ca2d443c636f6e66696750726f70657274793e3d3c76616c75653e20746f2061737369676e206f72206f7665727269646520636f6e66696775726174696f6e20706172616d73> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-q
-0.5 w
-0.9333 0.9333 0.9333 SCN
-108.24 280.33 m
-108.24 177.65 l
-S
-Q
-0.098 0.251 0.4863 scn
-0.098 0.251 0.4863 SCN
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
 
 BT
-67.956 220.422 Td
-/F5.1 24 Tf
-<21> Tj
+59.24 275.345 Td
+/F4.0 11 Tf
+<ca2d4468626173652e63616e6172792e726561642e7261772e656e61626c65643d3c747275652f66616c73653e2053657420746f20656e61626c652f64697361626c6520726177207363616e3b> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -603489,132 +603502,111 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-3.7023 Tw
-
 BT
-120.24 264.366 Td
-/F1.0 10.5 Tf
-<54686520> Tj
+59.24 260.605 Td
+/F4.0 11 Tf
+<64656661756c743d66616c7365> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
-
-3.7023 Tw
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
 
 BT
-145.3623 264.366 Td
-/F4.0 10.5 Tf
-<53696e6b> Tj
+59.24 231.125 Td
+/F4.0 11 Tf
+<43616e6172792072756e7320696e206f6e65206f66207468726565206d6f6465733a20726567696f6e202864656661756c74292c20726567696f6e7365727665722c206f72207a6f6f6b65657065722e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-3.7023 Tw
-
 BT
-166.3623 264.366 Td
-/F1.0 10.5 Tf
-<20636c61737320697320696e7374616e746961746564207573696e672074686520> Tj
+59.24 216.385 Td
+/F4.0 11 Tf
+<546f20736e6966662f70726f626520616c6c20726567696f6e732c2070617373206e6f20617267756d656e74732e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
-
-3.7023 Tw
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
 
 BT
-339.8284 264.366 Td
-/F4.0 10.5 Tf
-<68626173652e63616e6172792e73696e6b2e636c617373> Tj
+59.24 201.645 Td
+/F4.0 11 Tf
+<546f20736e6966662f70726f626520616c6c20726567696f6e73206f662061207461626c652c2070617373207461626c656e616d652e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-3.7023 Tw
-
 BT
-460.5784 264.366 Td
-/F1.0 10.5 Tf
-[<20636f6e6669677572> 20.0195 <6174696f6e>] TJ
+59.24 186.905 Td
+/F4.0 11 Tf
+<546f20736e6966662f70726f626520726567696f6e736572766572732c2070617373202d726567696f6e7365727665722c206574632e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.9182 Tw
-
 BT
-120.24 248.586 Td
-/F1.0 10.5 Tf
-<70726f70657274792077686963682077696c6c20616c736f2064657465726d696e65207468652075736564204d6f6e69746f7220636c6173732e20496e2074686520616273656e6365206f662074686973> Tj
+59.24 172.165 Td
+/F4.0 11 Tf
+<53656520687474703a2f2f68626173652e6170616368652e6f72672f626f6f6b2e68746d6c235f63616e61727920666f722043616e61727920646f63756d656e746174696f6e2e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-0.3194 Tw
+q
+0.5 w
+0.9333 0.9333 0.9333 SCN
+108.24 146.25 m
+108.24 106.69 l
+S
+Q
+0.098 0.251 0.4863 scn
+0.098 0.251 0.4863 SCN
 
 BT
-120.24 232.806 Td
-/F1.0 10.5 Tf
-[<70726f706572747920526567696f6e5365727665725374644f757453696e6b2077696c6c20626520757365642e2059> 69.8242 <6f75206e65656420746f20757365207468652053696e6b206163636f7264696e67>] TJ
+67.956 117.902 Td
+/F5.1 24 Tf
+<21> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.9163 Tw
+3.7023 Tw
 
 BT
-120.24 217.026 Td
+120.24 130.286 Td
 /F1.0 10.5 Tf
-[<746f207468652070617373656420706172> 20.0195 <616d657465727320746f2074686520>] TJ
+<54686520> Tj
 ET
 
 
 0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
 
-0.9163 Tw
+3.7023 Tw
 
 BT
-284.8653 217.026 Td
-/F3.0 10.5 Tf
-<63616e617279> Tj
+145.3623 130.286 Td
+/F4.0 10.5 Tf
+<53696e6b> Tj
 ET
 
 
@@ -603624,12 +603616,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.9163 Tw
+3.7023 Tw
 
 BT
-318.8538 217.026 Td
+166.3623 130.286 Td
 /F1.0 10.5 Tf
-<20636f6d6d616e642e20417320616e206578616d706c6520796f75206861766520746f20736574> Tj
+<20636c61737320697320696e7374616e746961746564207573696e672074686520> Tj
 ET
 
 
@@ -603639,10 +603631,10 @@ ET
 0.6941 0.1294 0.2745 scn
 0.6941 0.1294 0.2745 SCN
 
-117.3992 Tw
+3.7023 Tw
 
 BT
-120.24 201.246 Td
+339.8284 130.286 Td
 /F4.0 10.5 Tf
 <68626173652e63616e6172792e73696e6b2e636c617373> Tj
 ET
@@ -603654,36 +603646,25 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-117.3992 Tw
+3.7023 Tw
 
 BT
-240.99 201.246 Td
+460.5784 130.286 Td
 /F1.0 10.5 Tf
-<2070726f706572747920746f> Tj
+[<20636f6e6669677572> 20.0195 <6174696f6e>] TJ
 ET
 
 
 0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
-
-BT
-120.24 185.466 Td
-/F4.0 10.5 Tf
-<6f72672e6170616368652e6861646f6f702e68626173652e746f6f6c2e43616e61727924526567696f6e5374644f757453696e6b> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-393.24 185.466 Td
+120.24 114.506 Td
 /F1.0 10.5 Tf
-[<20666f72207573696e67207461626c6520706172> 20.0195 <616d65746572732e>] TJ
+[<70726f7065727479> 89.8438 <2e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -603694,7 +603675,7 @@ ET
 1.6392 Tw
 
 BT
-48.24 153.686 Td
+48.24 82.726 Td
 /F1.0 10.5 Tf
 [<5468697320746f6f6c2077696c6c2072657475726e206e6f6e207a65726f206572726f7220636f64657320746f207573657220666f7220636f6c6c61626f72> 20.0195 <6174696e672077697468206f74686572206d6f6e69746f72696e6720746f6f6c732c>] TJ
 ET
@@ -603707,7 +603688,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 137.906 Td
+48.24 66.946 Td
 /F1.0 10.5 Tf
 <73756368206173204e6167696f732e20546865206572726f7220636f646520646566696e6974696f6e73206172653a> Tj
 ET
@@ -603752,7 +603733,6 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 /F5.1 47 0 R
-/F3.0 35 0 R
 >>
 /XObject << /Stamp1 5007 0 R
 >>
@@ -603763,7 +603743,7 @@ endobj
 [3047 0 R /XYZ 0 841.89 null]
 endobj
 3049 0 obj
-<< /Length 21559
+<< /Length 21566
 >>
 stream
 q
@@ -604571,12 +604551,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.3987 Tw
+1.0161 Tw
 
 BT
 48.24 686.226 Td
 /F1.0 10.5 Tf
-[<486572652061726520736f6d65206578616d706c6573206261736564206f6e2074686520666f6c6c6f77696e6720676976656e20636173652e205468657265206172652074776f2054> 29.7852 <61626c65206f626a656374732063616c6c656420746573742d>] TJ
+[<486572652061726520736f6d65206578616d706c6573206261736564206f6e2074686520666f6c6c6f77696e6720676976656e20636173653a20676976656e2074776f2054> 29.7852 <61626c65206f626a656374732063616c6c656420746573742d3031>] TJ
 ET
 
 
@@ -604586,12 +604566,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.7311 Tw
+0.293 Tw
 
 BT
 48.24 670.446 Td
 /F1.0 10.5 Tf
-[<303120616e6420746573742d30322c207468657920686176652074776f20636f6c756d6e2066616d696c792063663120616e642063663220726573706563746976656c79> 89.8438 <2c20616e64206465706c6f> 20.0195 <796564206f6e207468652033>] TJ
+[<616e6420746573742d3032206561636820776974682074776f20636f6c756d6e2066616d696c792063663120616e642063663220726573706563746976656c79> 89.8438 <2c206465706c6f> 20.0195 <796564206f6e203320526567696f6e536572766572732e20536565>] TJ
 ET
 
 
@@ -604604,7 +604584,7 @@ ET
 BT
 48.24 654.666 Td
 /F1.0 10.5 Tf
-<526567696f6e536572766572732e2073656520666f6c6c6f77696e67207461626c652e> Tj
+<74686520666f6c6c6f77696e67207461626c652e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -605076,7 +605056,7 @@ ET
 BT
 48.24 533.766 Td
 /F1.0 10.5 Tf
-[<46> 40.0391 <6f6c6c6f77696e672061726520736f6d65206578616d706c6573206261736564206f6e207468652070726576696f757320676976656e20636173652e>] TJ
+[<46> 40.0391 <6f6c6c6f77696e672061726520736f6d65206578616d706c65206f757470757473206261736564206f6e207468652070726576696f757320676976656e20636173652e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -605331,12 +605311,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.1856 Tw
+1.4448 Tw
 
 BT
 48.24 140.966 Td
 /F1.0 10.5 Tf
-<536f20796f752063616e207365652c207461626c6520746573742d3031206861732074776f20726567696f6e7320616e642074776f20636f6c756d6e2066616d696c6965732c20736f207468652043616e61727920746f6f6c2077696c6c207069636b2034> Tj
+<536f20796f752063616e207365652c207461626c6520746573742d3031206861732074776f20726567696f6e7320616e642074776f20636f6c756d6e2066616d696c6965732c20736f207468652043616e61727920746f6f6c20696e20746865> Tj
 ET
 
 
@@ -605346,12 +605326,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.518 Tw
+0.085 Tw
 
 BT
 48.24 125.186 Td
 /F1.0 10.5 Tf
-<736d616c6c207069656365206f6620646174612066726f6d203420283220726567696f6e202a20322073746f72652920646966666572656e742073746f7265732e205468697320697320612064656661756c74206265686176696f72206f66207468652074686973> Tj
+<64656661756c742022726567696f6e206d6f6465222077696c6c207069636b203420736d616c6c207069656365206f6620646174612066726f6d203420283220726567696f6e202a20322073746f72652920646966666572656e742073746f7265732e2054686973> Tj
 ET
 
 
@@ -605364,7 +605344,7 @@ ET
 BT
 48.24 109.406 Td
 /F1.0 10.5 Tf
-<746f6f6c20646f65732e> Tj
+<697320612064656661756c74206265686176696f722e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -605416,7 +605396,7 @@ endobj
 [3050 0 R /XYZ 0 517.95 null]
 endobj
 3052 0 obj
-<< /Length 9532
+<< /Length 9506
 >>
 stream
 q
@@ -605428,7 +605408,7 @@ q
 BT
 48.24 792.006 Td
 /F2.0 13 Tf
-<3134392e312e322e2043616e617279207465737420666f7220657665727920636f6c756d6e2066616d696c79202873746f726529206f6620657665727920726567696f6e206f66> Tj
+<3134392e312e322e2043616e617279207465737420666f7220657665727920636f6c756d6e2066616d696c79202873746f726529206f6620657665727920726567696f6e206f662061> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -605450,7 +605430,7 @@ ET
 BT
 48.24 747.766 Td
 /F1.0 10.5 Tf
-[<59> 69.8242 <6f752063616e20616c736f2074657374206f6e65206f72206d6f7265207370656369666963207461626c65732e>] TJ
+[<59> 69.8242 <6f752063616e20616c736f2074657374206f6e65206f72206d6f7265207370656369666963207461626c65732062> 20.0195 <792070617373696e67207461626c65206e616d65732e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -605507,12 +605487,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.5052 Tw
+0.9336 Tw
 
 BT
 48.24 637.966 Td
 /F1.0 10.5 Tf
-<546869732077696c6c207069636b206f6e6520736d616c6c207069656365206f6620646174612066726f6d206561636820526567696f6e5365727665722c20616e642063616e20616c736f2070757420796f757220526567696f6e536572766572> Tj
+<496e2022726567696f6e736572766572206d6f6465222c207468652043616e61727920746f6f6c2077696c6c207069636b206f6e6520736d616c6c207069656365206f6620646174612066726f6d206561636820526567696f6e536572766572> Tj
 ET
 
 
@@ -605522,38 +605502,53 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+2.4007 Tw
+
 BT
 48.24 622.186 Td
 /F1.0 10.5 Tf
-<6e616d6520617320696e707574206f7074696f6e7320666f722063616e6172792d7465737420737065636966696320526567696f6e5365727665722e> Tj
+[<2859> 69.8242 <6f752063616e20616c736f2070617373206f6e65206f72206d6f726520526567696f6e536572766572206e616d657320617320617267756d656e747320746f207468652063616e6172792d74657374207768656e20696e>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+48.24 606.406 Td
+/F1.0 10.5 Tf
+<22726567696f6e736572766572206d6f646522292e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 606.37 m
-543.04 606.37 l
-545.2491 606.37 547.04 604.5791 547.04 602.37 c
-547.04 470.45 l
-547.04 468.2409 545.2491 466.45 543.04 466.45 c
-52.24 466.45 l
-50.0309 466.45 48.24 468.2409 48.24 470.45 c
-48.24 602.37 l
-48.24 604.5791 50.0309 606.37 52.24 606.37 c
+52.24 590.59 m
+543.04 590.59 l
+545.2491 590.59 547.04 588.7991 547.04 586.59 c
+547.04 454.67 l
+547.04 452.4609 545.2491 450.67 543.04 450.67 c
+52.24 450.67 l
+50.0309 450.67 48.24 452.4609 48.24 454.67 c
+48.24 586.59 l
+48.24 588.7991 50.0309 590.59 52.24 590.59 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 606.37 m
-543.04 606.37 l
-545.2491 606.37 547.04 604.5791 547.04 602.37 c
-547.04 470.45 l
-547.04 468.2409 545.2491 466.45 543.04 466.45 c
-52.24 466.45 l
-50.0309 466.45 48.24 468.2409 48.24 470.45 c
-48.24 602.37 l
-48.24 604.5791 50.0309 606.37 52.24 606.37 c
+52.24 590.59 m
+543.04 590.59 l
+545.2491 590.59 547.04 588.7991 547.04 586.59 c
+547.04 454.67 l
+547.04 452.4609 545.2491 450.67 543.04 450.67 c
+52.24 450.67 l
+50.0309 450.67 48.24 452.4609 48.24 454.67 c
+48.24 586.59 l
+48.24 588.7991 50.0309 590.59 52.24 590.59 c
 h
 S
 Q
@@ -605561,7 +605556,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 583.545 Td
+59.24 567.765 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d726567696f6e736572766572> Tj
 ET
@@ -605572,7 +605567,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 554.065 Td
+59.24 538.285 Td
 /F4.0 11 Tf
 <31332f31322f30392030363a30353a313720494e464f20746f6f6c2e43616e6172793a20526561642066726f6d207461626c653a746573742d3031206f6e20726567696f6e207365727665723a72733220696e> Tj
 ET
@@ -605583,7 +605578,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 539.325 Td
+59.24 523.545 Td
 /F4.0 11 Tf
 <37326d73> Tj
 ET
@@ -605594,7 +605589,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 524.585 Td
+59.24 508.805 Td
 /F4.0 11 Tf
 <31332f31322f30392030363a30353a313720494e464f20746f6f6c2e43616e6172793a20526561642066726f6d207461626c653a746573742d3032206f6e20726567696f6e207365727665723a72733320696e> Tj
 ET
@@ -605605,7 +605600,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 509.845 Td
+59.24 494.065 Td
 /F4.0 11 Tf
 <33346d73> Tj
 ET
@@ -605616,7 +605611,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 495.105 Td
+59.24 479.325 Td
 /F4.0 11 Tf
 <31332f31322f30392030363a30353a313720494e464f20746f6f6c2e43616e6172793a20526561642066726f6d207461626c653a746573742d3031206f6e20726567696f6e207365727665723a72733120696e> Tj
 ET
@@ -605627,7 +605622,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 480.365 Td
+59.24 464.585 Td
 /F4.0 11 Tf
 <35366d73> Tj
 ET
@@ -605638,7 +605633,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 435.766 Td
+48.24 419.986 Td
 /F2.0 13 Tf
 <3134392e312e342e2043616e6172792074657374207769746820726567756c61722065787072657373696f6e207061747465726e> Tj
 ET
@@ -605648,38 +605643,53 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+3.5116 Tw
+
 BT
-48.24 409.206 Td
+48.24 393.426 Td
 /F1.0 10.5 Tf
-<546869732077696c6c207465737420626f7468207461626c6520746573742d303120616e6420746573742d30322e> Tj
+[<59> 69.8242 <6f752063616e2070617373207265676578657320666f72207461626c65206e616d6573207768656e20696e2022726567696f6e206d6f646522206f7220666f72207365727665726e616d6573207768656e20696e>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+48.24 377.646 Td
+/F1.0 10.5 Tf
+<22726567696f6e736572766572206d6f6465222e205468652062656c6f772077696c6c207465737420626f7468207461626c6520746573742d303120616e6420746573742d30322e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 393.39 m
-543.04 393.39 l
-545.2491 393.39 547.04 391.5991 547.04 389.39 c
-547.04 360.65 l
-547.04 358.4409 545.2491 356.65 543.04 356.65 c
-52.24 356.65 l
-50.0309 356.65 48.24 358.4409 48.24 360.65 c
-48.24 389.39 l
-48.24 391.5991 50.0309 393.39 52.24 393.39 c
+52.24 361.83 m
+543.04 361.83 l
+545.2491 361.83 547.04 360.0391 547.04 357.83 c
+547.04 329.09 l
+547.04 326.8809 545.2491 325.09 543.04 325.09 c
+52.24 325.09 l
+50.0309 325.09 48.24 326.8809 48.24 329.09 c
+48.24 357.83 l
+48.24 360.0391 50.0309 361.83 52.24 361.83 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 393.39 m
-543.04 393.39 l
-545.2491 393.39 547.04 391.5991 547.04 389.39 c
-547.04 360.65 l
-547.04 358.4409 545.2491 356.65 543.04 356.65 c
-52.24 356.65 l
-50.0309 356.65 48.24 358.4409 48.24 360.65 c
-48.24 389.39 l
-48.24 391.5991 50.0309 393.39 52.24 393.39 c
+52.24 361.83 m
+543.04 361.83 l
+545.2491 361.83 547.04 360.0391 547.04 357.83 c
+547.04 329.09 l
+547.04 326.8809 545.2491 325.09 543.04 325.09 c
+52.24 325.09 l
+50.0309 325.09 48.24 326.8809 48.24 329.09 c
+48.24 357.83 l
+48.24 360.0391 50.0309 361.83 52.24 361.83 c
 h
 S
 Q
@@ -605687,7 +605697,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 370.565 Td
+59.24 339.005 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d6520746573742d305b312d325d> Tj
 ET
@@ -605698,9 +605708,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 325.966 Td
+48.24 294.406 Td
 /F2.0 13 Tf
-<3134392e312e352e2052756e2063616e6172792074657374206173206461656d6f6e206d6f6465> Tj
+[<3134392e312e352e2052756e2063616e6172792074657374206173206120226461656d6f6e> 40.0391 <22>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -605708,12 +605718,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.3266 Tw
+0.4562 Tw
 
 BT
-48.24 299.406 Td
+48.24 267.846 Td
 /F1.0 10.5 Tf
-<52756e2072657065617465646c79207769746820696e74657276616c20646566696e656420696e206f7074696f6e20> Tj
+<52756e2072657065617465646c79207769746820616e20696e74657276616c20646566696e65642076696120746865206f7074696f6e20> Tj
 ET
 
 
@@ -605723,10 +605733,10 @@ ET
 0.6941 0.1294 0.2745 scn
 0.6941 0.1294 0.2745 SCN
 
-1.3266 Tw
+0.4562 Tw
 
 BT
-293.272 299.406 Td
+327.3831 267.846 Td
 /F4.0 10.5 Tf
 <2d696e74657276616c> Tj
 ET
@@ -605738,12 +605748,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.3266 Tw
+0.4562 Tw
 
 BT
-340.522 299.406 Td
+374.6331 267.846 Td
 /F1.0 10.5 Tf
-<2077686f73652064656661756c742076616c7565206973203630207365636f6e64732e2054686973> Tj
+<202864656661756c742076616c7565206973203630207365636f6e6473292e2054686973> Tj
 ET
 
 
@@ -605753,12 +605763,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.3692 Tw
+0.1004 Tw
 
 BT
-48.24 283.626 Td
+48.24 252.066 Td
 /F1.0 10.5 Tf
-[<6461656d6f6e2077696c6c2073746f7020697473656c6620616e642072657475726e206e6f6e2d7a65726f206572726f7220636f646520696620616e> 20.0195 <79206572726f72206f63637572732c2064756520746f207468652064656661756c742076616c7565>] TJ
+[<6461656d6f6e2077696c6c2073746f7020697473656c6620616e642072657475726e206e6f6e2d7a65726f206572726f7220636f646520696620616e> 20.0195 <79206572726f72206f636375722e2054> 29.7852 <6f206861766520746865206461656d6f6e206b> 20.0195 <656570>] TJ
 ET
 
 
@@ -605769,37 +605779,37 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 267.846 Td
+48.24 236.286 Td
 /F1.0 10.5 Tf
-<6f66206f7074696f6e202d6620697320747275652e> Tj
+<72756e6e696e67206163726f7373206572726f72732c207061737320746865202d6620666c61672077697468206974732076616c75652073657420746f2066616c736520287365652075736167652061626f7665292e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 252.03 m
-543.04 252.03 l
-545.2491 252.03 547.04 250.2391 547.04 248.03 c
-547.04 219.29 l
-547.04 217.0809 545.2491 215.29 543.04 215.29 c
-52.24 215.29 l
-50.0309 215.29 48.24 217.0809 48.24 219.29 c
-48.24 248.03 l
-48.24 250.2391 50.0309 252.03 52.24 252.03 c
+52.24 220.47 m
+543.04 220.47 l
+545.2491 220.47 547.04 218.6791 547.04 216.47 c
+547.04 187.73 l
+547.04 185.5209 545.2491 183.73 543.04 183.73 c
+52.24 183.73 l
+50.0309 183.73 48.24 185.5209 48.24 187.73 c
+48.24 216.47 l
+48.24 218.6791 50.0309 220.47 52.24 220.47 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 252.03 m
-543.04 252.03 l
-545.2491 252.03 547.04 250.2391 547.04 248.03 c
-547.04 219.29 l
-547.04 217.0809 545.2491 215.29 543.04 215.29 c
-52.24 215.29 l
-50.0309 215.29 48.24 217.0809 48.24 219.29 c
-48.24 248.03 l
-48.24 250.2391 50.0309 252.03 52.24 252.03 c
+52.24 220.47 m
+543.04 220.47 l
+545.2491 220.47 547.04 218.6791 547.04 216.47 c
+547.04 187.73 l
+547.04 185.5209 545.2491 183.73 543.04 183.73 c
+52.24 183.73 l
+50.0309 183.73 48.24 185.5209 48.24 187.73 c
+48.24 216.47 l
+48.24 218.6791 50.0309 220.47 52.24 220.47 c
 h
 S
 Q
@@ -605807,7 +605817,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 229.205 Td
+59.24 197.645 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d6461656d6f6e> Tj
 ET
@@ -605818,37 +605828,37 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 191.326 Td
+48.24 159.766 Td
 /F1.0 10.5 Tf
-<52756e2072657065617465646c7920776974682035207365636f6e6420696e74657276616c7320616e642077696c6c206e6f742073746f7020697473656c66206576656e206966206572726f7273206f6363757220696e2074686520746573742e> Tj
+[<54> 29.7852 <6f2072756e2072657065617465646c7920776974682035207365636f6e6420696e74657276616c7320616e64206e6f742073746f70206f6e206572726f72732c20646f2074686520666f6c6c6f77696e672e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 175.51 m
-543.04 175.51 l
-545.2491 175.51 547.04 173.7191 547.04 171.51 c
-547.04 142.77 l
-547.04 140.5609 545.2491 138.77 543.04 138.77 c
-52.24 138.77 l
-50.0309 138.77 48.24 140.5609 48.24 142.77 c
-48.24 171.51 l
-48.24 173.7191 50.0309 175.51 52.24 175.51 c
+52.24 143.95 m
+543.04 143.95 l
+545.2491 143.95 547.04 142.1591 547.04 139.95 c
+547.04 111.21 l
+547.04 109.0009 545.2491 107.21 543.04 107.21 c
+52.24 107.21 l
+50.0309 107.21 48.24 109.0009 48.24 111.21 c
+48.24 139.95 l
+48.24 142.1591 50.0309 143.95 52.24 143.95 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 175.51 m
-543.04 175.51 l
-545.2491 175.51 547.04 173.7191 547.04 171.51 c
-547.04 142.77 l
-547.04 140.5609 545.2491 138.77 543.04 138.77 c
-52.24 138.77 l
-50.0309 138.77 48.24 140.5609 48.24 142.77 c
-48.24 171.51 l
-48.24 173.7191 50.0309 175.51 52.24 175.51 c
+52.24 143.95 m
+543.04 143.95 l
+545.2491 143.95 547.04 142.1591 547.04 139.95 c
+547.04 111.21 l
+547.04 109.0009 545.2491 107.21 543.04 107.21 c
+52.24 107.21 l
+50.0309 107.21 48.24 109.0009 48.24 111.21 c
+48.24 139.95 l
+48.24 142.1591 50.0309 143.95 52.24 143.95 c
 h
 S
 Q
@@ -605856,54 +605866,13 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 152.685 Td
+59.24 121.125 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d6461656d6f6e202d696e74657276616c2035202d662066616c7365> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-48.24 108.086 Td
-/F2.0 13 Tf
-[<3134392e312e362e2046> 40.0391 <6f7263652074696d656f75742069662063616e617279207465737420737475636b>] TJ
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-0.563 Tw
-
-BT
-48.24 81.526 Td
-/F1.0 10.5 Tf
-<496e20736f6d6520636173657320746865207265717565737420697320737475636b20616e64206e6f20726573706f6e73652069732073656e74206261636b20746f2074686520636c69656e742e20546869732063616e2068617070656e2077697468> Tj
-ET
-
-
-0.0 Tw
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-1.5888 Tw
-
-BT
-48.24 65.746 Td
-/F1.0 10.5 Tf
-<6465616420526567696f6e5365727665727320776869636820746865206d617374657220686173206e6f7420796574206e6f74696365642e2042656361757365206f6620746869732077652070726f7669646520612074696d656f7574> Tj
-ET
-
-
-0.0 Tw
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
 q
 0.0 0.0 0.0 scn
 0.0 0.0 0.0 SCN
@@ -605954,16 +605923,13 @@ endobj
 [3053 0 R /XYZ 0 683.21 null]
 endobj
 3056 0 obj
-[3053 0 R /XYZ 0 454.45 null]
+[3053 0 R /XYZ 0 438.67 null]
 endobj
 3057 0 obj
-[3053 0 R /XYZ 0 344.65 null]
+[3053 0 R /XYZ 0 313.09 null]
 endobj
 3058 0 obj
-[3053 0 R /XYZ 0 126.77 null]
-endobj
-3059 0 obj
-<< /Length 11845
+<< /Length 11750
 >>
 stream
 q
@@ -605972,12 +605938,38 @@ q
 /DeviceRGB CS
 0.2 0.2 0.2 SCN
 
-0.1839 Tw
+BT
+48.24 792.006 Td
+/F2.0 13 Tf
+[<3134392e312e362e2046> 40.0391 <6f7263652074696d656f75742069662063616e617279207465737420737475636b>] TJ
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+0.563 Tw
 
 BT
-48.24 794.676 Td
+48.24 765.446 Td
+/F1.0 10.5 Tf
+<496e20736f6d6520636173657320746865207265717565737420697320737475636b20616e64206e6f20726573706f6e73652069732073656e74206261636b20746f2074686520636c69656e742e20546869732063616e2068617070656e2077697468> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+1.5888 Tw
+
+BT
+48.24 749.666 Td
 /F1.0 10.5 Tf
-<6f7074696f6e20746f206b696c6c207468652063616e617279207465737420616e642072657475726e2061206e6f6e2d7a65726f206572726f7220636f64652e20546869732072756e2073657473207468652074696d656f75742076616c756520746f203630> Tj
+<6465616420526567696f6e5365727665727320776869636820746865206d617374657220686173206e6f7420796574206e6f74696365642e2042656361757365206f6620746869732077652070726f7669646520612074696d656f7574> Tj
 ET
 
 
@@ -605987,38 +605979,53 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.4659 Tw
+
 BT
-48.24 778.896 Td
+48.24 733.886 Td
+/F1.0 10.5 Tf
+<6f7074696f6e20746f206b696c6c207468652063616e617279207465737420616e642072657475726e2061206e6f6e2d7a65726f206572726f7220636f64652e205468652062656c6f772073657473207468652074696d656f75742076616c756520746f> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+48.24 718.106 Td
 /F1.0 10.5 Tf
-<7365636f6e64732c207468652064656661756c742076616c756520697320363030207365636f6e64732e> Tj
+<3630207365636f6e647320287468652064656661756c742076616c756520697320363030207365636f6e6473292e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 763.08 m
-543.04 763.08 l
-545.2491 763.08 547.04 761.2891 547.04 759.08 c
-547.04 730.34 l
-547.04 728.1309 545.2491 726.34 543.04 726.34 c
-52.24 726.34 l
-50.0309 726.34 48.24 728.1309 48.24 730.34 c
-48.24 759.08 l
-48.24 761.2891 50.0309 763.08 52.24 763.08 c
+52.24 702.29 m
+543.04 702.29 l
+545.2491 702.29 547.04 700.4991 547.04 698.29 c
+547.04 669.55 l
+547.04 667.3409 545.2491 665.55 543.04 665.55 c
+52.24 665.55 l
+50.0309 665.55 48.24 667.3409 48.24 669.55 c
+48.24 698.29 l
+48.24 700.4991 50.0309 702.29 52.24 702.29 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 763.08 m
-543.04 763.08 l
-545.2491 763.08 547.04 761.2891 547.04 759.08 c
-547.04 730.34 l
-547.04 728.1309 545.2491 726.34 543.04 726.34 c
-52.24 726.34 l
-50.0309 726.34 48.24 728.1309 48.24 730.34 c
-48.24 759.08 l
-48.24 761.2891 50.0309 763.08 52.24 763.08 c
+52.24 702.29 m
+543.04 702.29 l
+545.2491 702.29 547.04 700.4991 547.04 698.29 c
+547.04 669.55 l
+547.04 667.3409 545.2491 665.55 543.04 665.55 c
+52.24 665.55 l
+50.0309 665.55 48.24 667.3409 48.24 669.55 c
+48.24 698.29 l
+48.24 700.4991 50.0309 702.29 52.24 702.29 c
 h
 S
 Q
@@ -606026,7 +606033,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 740.255 Td
+59.24 679.465 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d74203630303030> Tj
 ET
@@ -606037,7 +606044,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 695.656 Td
+48.24 634.866 Td
 /F2.0 13 Tf
 <3134392e312e372e20456e61626c6520777269746520736e696666696e6720696e2063616e617279> Tj
 ET
@@ -606047,12 +606054,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.2256 Tw
+1.0248 Tw
 
 BT
-48.24 669.096 Td
+48.24 608.306 Td
 /F1.0 10.5 Tf
-[<42> 20.0195 <792064656661756c742c207468652063616e61727920746f6f6c206f6e6c7920636865636b207468652072656164206f706572> 20.0195 <6174696f6e732c206974d573206861726420746f2066696e64207468652070726f626c656d20696e20746865207772697465>] TJ
+[<42> 20.0195 <792064656661756c742c207468652063616e61727920746f6f6c206f6e6c7920636865636b732072656164206f706572> 20.0195 <6174696f6e732e2054> 29.7852 <6f20656e61626c652074686520777269746520736e696666696e672c20796f752063616e2072756e>] TJ
 ET
 
 
@@ -606062,12 +606069,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.3752 Tw
+0.788 Tw
 
 BT
-48.24 653.316 Td
+48.24 592.526 Td
 /F1.0 10.5 Tf
-[<706174682e2054> 29.7852 <6f20656e61626c652074686520777269746520736e696666696e672c20796f752063616e2072756e2063616e61727920776974682074686520>] TJ
+<7468652063616e61727920776974682074686520> Tj
 ET
 
 
@@ -606077,10 +606084,10 @@ ET
 0.6941 0.1294 0.2745 scn
 0.6941 0.1294 0.2745 SCN
 
-1.3752 Tw
+0.788 Tw
 
 BT
-380.259 653.316 Td
+151.5621 592.526 Td
 /F4.0 10.5 Tf
 <2d7772697465536e696666696e67> Tj
 ET
@@ -606092,12 +606099,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.3752 Tw
+0.788 Tw
 
 BT
-453.759 653.316 Td
+225.0621 592.526 Td
 /F1.0 10.5 Tf
-<206f7074696f6e2e205768656e20746865> Tj
+<206f7074696f6e207365742e205768656e20777269746520736e696666696e6720697320656e61626c65642c207468652063616e61727920746f6f6c2077696c6c> Tj
 ET
 
 
@@ -606107,12 +606114,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.0133 Tw
+0.186 Tw
 
 BT
-48.24 637.536 Td
+48.24 576.746 Td
 /F1.0 10.5 Tf
-[<777269746520736e696666696e6720697320656e61626c65642c207468652063616e61727920746f6f6c2077696c6c2063726561746520616e206862617365207461626c6520616e64206d616b> 20.0195 <6520737572652074686520726567696f6e73206f6620746865>] TJ
+[<63726561746520616e206862617365207461626c6520616e64206d616b> 20.0195 <6520737572652074686520726567696f6e73206f6620746865207461626c652061726520646973747269627574656420746f20616c6c20726567696f6e20736572766572732e20496e>] TJ
 ET
 
 
@@ -606122,12 +606129,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.4871 Tw
+0.7145 Tw
 
 BT
-48.24 621.756 Td
+48.24 560.966 Td
 /F1.0 10.5 Tf
-<7461626c65206469737472696275746564206f6e20616c6c20726567696f6e20736572766572732e20496e206561636820736e696666696e6720706572696f642c207468652063616e6172792077696c6c2074727920746f20707574206461746120746f> Tj
+<6561636820736e696666696e6720706572696f642c207468652063616e6172792077696c6c2074727920746f20707574206461746120746f20746865736520726567696f6e7320746f20636865636b2074686520777269746520617661696c6162696c697479> Tj
 ET
 
 
@@ -606138,37 +606145,37 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 605.976 Td
+48.24 545.186 Td
 /F1.0 10.5 Tf
-<746865736520726567696f6e7320746f20636865636b2074686520777269746520617661696c6162696c697479206f66206561636820726567696f6e207365727665722e> Tj
+<6f66206561636820726567696f6e207365727665722e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 590.16 m
-543.04 590.16 l
-545.2491 590.16 547.04 588.3691 547.04 586.16 c
-547.04 557.42 l
-547.04 555.2109 545.2491 553.42 543.04 553.42 c
-52.24 553.42 l
-50.0309 553.42 48.24 555.2109 48.24 557.42 c
-48.24 586.16 l
-48.24 588.3691 50.0309 590.16 52.24 590.16 c
+52.24 529.37 m
+543.04 529.37 l
+545.2491 529.37 547.04 527.5791 547.04 525.37 c
+547.04 496.63 l
+547.04 494.4209 545.2491 492.63 543.04 492.63 c
+52.24 492.63 l
+50.0309 492.63 48.24 494.4209 48.24 496.63 c
+48.24 525.37 l
+48.24 527.5791 50.0309 529.37 52.24 529.37 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 590.16 m
-543.04 590.16 l
-545.2491 590.16 547.04 588.3691 547.04 586.16 c
-547.04 557.42 l
-547.04 555.2109 545.2491 553.42 543.04 553.42 c
-52.24 553.42 l
-50.0309 553.42 48.24 555.2109 48.24 557.42 c
-48.24 586.16 l
-48.24 588.3691 50.0309 590.16 52.24 590.16 c
+52.24 529.37 m
+543.04 529.37 l
+545.2491 529.37 547.04 527.5791 547.04 525.37 c
+547.04 496.63 l
+547.04 494.4209 545.2491 492.63 543.04 492.63 c
+52.24 492.63 l
+50.0309 492.63 48.24 494.4209 48.24 496.63 c
+48.24 525.37 l
+48.24 527.5791 50.0309 529.37 52.24 529.37 c
 h
 S
 Q
@@ -606176,7 +606183,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 567.335 Td
+59.24 506.545 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d7772697465536e696666696e67> Tj
 ET
@@ -606187,7 +606194,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 529.456 Td
+48.24 468.666 Td
 /F1.0 10.5 Tf
 <5468652064656661756c74207772697465207461626c6520697320> Tj
 ET
@@ -606198,7 +606205,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-175.6155 529.456 Td
+175.6155 468.666 Td
 /F4.0 10.5 Tf
 <68626173653a63616e617279> Tj
 ET
@@ -606209,9 +606216,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-238.6155 529.456 Td
+238.6155 468.666 Td
 /F1.0 10.5 Tf
-[<20616e642063616e206265207370656369666965642062> 20.0195 <7920746865206f7074696f6e20>] TJ
+<20616e642063616e20626520737065636966696564207769746820746865206f7074696f6e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -606220,7 +606227,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-414.4483 529.456 Td
+425.043 468.666 Td
 /F4.0 10.5 Tf
 <2d77726974655461626c65> Tj
 ET
@@ -606231,7 +606238,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-472.1983 529.456 Td
+482.793 468.666 Td
 /F1.0 10.5 Tf
 <2e> Tj
 ET
@@ -606240,28 +606247,28 @@ ET
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 513.64 m
-543.04 513.64 l
-545.2491 513.64 547.04 511.8491 547.04 509.64 c
-547.04 480.9 l
-547.04 478.6909 545.2491 476.9 543.04 476.9 c
-52.24 476.9 l
-50.0309 476.9 48.24 478.6909 48.24 480.9 c
-48.24 509.64 l
-48.24 511.8491 50.0309 513.64 52.24 513.64 c
+52.24 452.85 m
+543.04 452.85 l
+545.2491 452.85 547.04 451.0591 547.04 448.85 c
+547.04 420.11 l
+547.04 417.9009 545.2491 416.11 543.04 416.11 c
+52.24 416.11 l
+50.0309 416.11 48.24 417.9009 48.24 420.11 c
+48.24 448.85 l
+48.24 451.0591 50.0309 452.85 52.24 452.85 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 513.64 m
-543.04 513.64 l
-545.2491 513.64 547.04 511.8491 547.04 509.64 c
-547.04 480.9 l
-547.04 478.6909 545.2491 476.9 543.04 476.9 c
-52.24 476.9 l
-50.0309 476.9 48.24 478.6909 48.24 480.9 c
-48.24 509.64 l
-48.24 511.8491 50.0309 513.64 52.24 513.64 c
+52.24 452.85 m
+543.04 452.85 l
+545.2491 452.85 547.04 451.0591 547.04 448.85 c
+547.04 420.11 l
+547.04 417.9009 545.2491 416.11 543.04 416.11 c
+52.24 416.11 l
+50.0309 416.11 48.24 417.9009 48.24 420.11 c
+48.24 448.85 l
+48.24 451.0591 50.0309 452.85 52.24 452.85 c
 h
 S
 Q
@@ -606269,7 +606276,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 490.815 Td
+59.24 430.025 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d7772697465536e696666696e67202d77726974655461626c65206e733a63616e617279> Tj
 ET
@@ -606279,12 +606286,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-5.3841 Tw
+6.6487 Tw
 
 BT
-48.24 452.936 Td
+48.24 392.146 Td
 /F1.0 10.5 Tf
-[<5468652064656661756c742076616c75652073697a65206f662065616368207075742069732031302062> 20.0195 <7974657320616e6420796f752063616e207365742069742062> 20.0195 <792074686520636f6e666967206b> 20.0195 <65793a>] TJ
+[<5468652064656661756c742076616c75652073697a65206f662065616368207075742069732031302062> 20.0195 <797465732e2059> 69.8242 <6f752063616e20736574206974207669612074686520636f6e666967206b> 20.0195 <65793a>] TJ
 ET
 
 
@@ -606295,7 +606302,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 437.156 Td
+48.24 376.366 Td
 /F4.0 10.5 Tf
 <68626173652e63616e6172792e77726974652e76616c75652e73697a65> Tj
 ET
@@ -606306,7 +606313,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-200.49 437.156 Td
+200.49 376.366 Td
 /F1.0 10.5 Tf
 <2e> Tj
 ET
@@ -606317,7 +606324,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 402.656 Td
+48.24 341.866 Td
 /F2.0 13 Tf
 <3134392e312e382e2054726561742072656164202f207772697465206661696c757265206173206572726f72> Tj
 ET
@@ -606327,12 +606334,20 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.3042 Tw
+4.2275 Tw
 
 BT
-48.24 376.096 Td
+48.24 315.306 Td
+/F1.0 10.5 Tf
+[<42> 20.0195 <792064656661756c742c207468652063616e61727920746f6f6c206f6e6c79206c6f67732072656164206661696c75726573>] TJ
+/F1.1 10.5 Tf
+<21> Tj
+/F1.0 10.5 Tf
+<d1> Tj
+/F1.1 10.5 Tf
+<21> Tj
 /F1.0 10.5 Tf
-[<42> 20.0195 <792064656661756c742c207468652063616e61727920746f6f6c206f6e6c79206c6f67732072656164206661696c7572652c2064756520746f20652e672e2052657472696573457868617573746564457863657074696f6e2c207768696c65>] TJ
+<64756520746f20652e672e2052657472696573457868617573746564457863657074696f6e2c> Tj
 ET
 
 
@@ -606342,12 +606357,35 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.9138 Tw
+2.1284 Tw
 
 BT
-48.24 360.316 Td
+48.24 299.526 Td
+/F1.0 10.5 Tf
+<6574632e> Tj
+/F1.1 10.5 Tf
+<21> Tj
+/F1.0 10.5 Tf
+<d1> Tj
+/F1.1 10.5 Tf
+<21> Tj
 /F1.0 10.5 Tf
-[<72657475726e696e67206e6f726d616c206578697420636f64652e2054> 29.7852 <6f2074726561742072656164202f207772697465206661696c757265206173206572726f722c20796f752063616e2072756e2063616e617279207769746820746865>] TJ
+[<616e642077696c6c2072657475726e2074686520276e6f726d616c27206578697420636f64652e2054> 29.7852 <6f20747265617420726561642f7772697465206661696c757265206173206572726f72732c20796f752063616e2072756e>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+1.5538 Tw
+
+BT
+48.24 283.746 Td
+/F1.0 10.5 Tf
+<63616e61727920776974682074686520> Tj
 ET
 
 
@@ -606357,49 +606395,68 @@ ET
 0.6941 0.1294 0.2745 scn
 0.6941 0.1294 0.2745 SCN
 
+1.5538 Tw
+
 BT
-48.24 344.536 Td
+134.3814 283.746 Td
 /F4.0 10.5 Tf
 <2d74726561744661696c75726541734572726f72> Tj
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+1.5538 Tw
+
 BT
-153.24 344.536 Td
+239.3814 283.746 Td
 /F1.0 10.5 Tf
-<206f7074696f6e2e205768656e20656e61626c65642c2072656164202f207772697465206661696c75726520776f756c6420726573756c7420696e206572726f72206578697420636f64652e> Tj
+<206f7074696f6e2e205768656e20656e61626c65642c20726561642f7772697465206661696c757265732077696c6c20726573756c7420696e20616e> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+48.24 267.966 Td
+/F1.0 10.5 Tf
+<6572726f72206578697420636f64652e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-52.24 328.72 m
-543.04 328.72 l
-545.2491 328.72 547.04 326.9291 547.04 324.72 c
-547.04 295.98 l
-547.04 293.7709 545.2491 291.98 543.04 291.98 c
-52.24 291.98 l
-50.0309 291.98 48.24 293.7709 48.24 295.98 c
-48.24 324.72 l
-48.24 326.9291 50.0309 328.72 52.24 328.72 c
+52.24 252.15 m
+543.04 252.15 l
+545.2491 252.15 547.04 250.3591 547.04 248.15 c
+547.04 219.41 l
+547.04 217.2009 545.2491 215.41 543.04 215.41 c
+52.24 215.41 l
+50.0309 215.41 48.24 217.2009 48.24 219.41 c
+48.24 248.15 l
+48.24 250.3591 50.0309 252.15 52.24 252.15 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 328.72 m
-543.04 328.72 l
-545.2491 328.72 547.04 326.9291 547.04 324.72 c
-547.04 295.98 l
-547.04 293.7709 545.2491 291.98 543.04 291.98 c
-52.24 291.98 l
-50.0309 291.98 48.24 293.7709 48.24 295.98 c
-48.24 324.72 l
-48.24 326.9291 50.0309 328.72 52.24 328.72 c
+52.24 252.15 m
+543.04 252.15 l
+545.2491 252.15 547.04 250.3591 547.04 248.15 c
+547.04 219.41 l
+547.04 217.2009 545.2491 215.41 543.04 215.41 c
+52.24 215.41 l
+50.0309 215.41 48.24 217.2009 48.24 219.41 c
+48.24 248.15 l
+48.24 250.3591 50.0309 252.15 52.24 252.15 c
 h
 S
 Q
@@ -606407,7 +606464,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-59.24 305.895 Td
+59.24 229.325 Td
 /F4.0 11 Tf
 <2420247b48424153455f484f4d457d2f62696e2f68626173652063616e617279202d74726561744661696c75726541734572726f72> Tj
 ET
@@ -606418,7 +606475,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 261.296 Td
+48.24 184.726 Td
 /F2.0 13 Tf
 [<3134392e312e392e2052756e6e696e672043616e61727920696e2061204b> 20.0195 <65726265726f732d656e61626c656420436c7573746572>] TJ
 ET
@@ -606428,12 +606485,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.4478 Tw
+0.9379 Tw
 
 BT
-48.24 234.736 Td
+48.24 158.166 Td
 /F1.0 10.5 Tf
-[<54> 29.7852 <6f2072756e2043616e61727920696e2061204b> 20.0195 <65726265726f732d656e61626c656420636c75737465722c20636f6e6669677572652074686520666f6c6c6f77696e672074776f2070726f7065727469657320696e20>] TJ
+[<54> 29.7852 <6f2072756e207468652043616e61727920696e2061204b> 20.0195 <65726265726f732d656e61626c656420636c75737465722c20636f6e6669677572652074686520666f6c6c6f77696e672074776f2070726f7065727469657320696e20>] TJ
 ET
 
 
@@ -606443,10 +606500,10 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.4478 Tw
+0.9379 Tw
 
 BT
-515.477 234.736 Td
+515.477 158.166 Td
 /F3.0 10.5 Tf
 <68626173652d> Tj
 ET
@@ -606459,7 +606516,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 218.956 Td
+48.24 142.386 Td
 /F3.0 10.5 Tf
 <736974652e786d6c> Tj
 ET
@@ -606470,7 +606527,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-86.271 218.956 Td
+86.271 142.386 Td
 /F1.0 10.5 Tf
 <3a> Tj
 ET
@@ -606483,7 +606540,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 191.176 Td
+56.8805 114.606 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -606496,7 +606553,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-66.24 193.36 Td
+66.24 116.79 Td
 /F4.0 10.5 Tf
 <68626173652e636c69656e742e6b65797461622e66696c65> Tj
 ET
@@ -606509,7 +606566,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 173.176 Td
+56.8805 96.606 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -606522,7 +606579,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-66.24 175.36 Td
+66.24 98.79 Td
 /F4.0 10.5 Tf
 <68626173652e636c69656e742e6b65726265726f732e7072696e636970616c> Tj
 ET
@@ -606533,20 +606590,84 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 149.176 Td
+48.24 72.606 Td
 /F1.0 10.5 Tf
 [<4b> 20.0195 <65726265726f732063726564656e7469616c732061726520726566726573686564206576657279203330207365636f6e6473207768656e2043616e6172792072756e7320696e206461656d6f6e206d6f64652e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
+q
+0.0 0.0 0.0 scn
+0.0 0.0 0.0 SCN
+1 w
+0 J
+0 j
+[] 0 d
+/Stamp2 Do
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+49.24 14.388 Td
+/F1.0 9 Tf
+<353232> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+Q
+Q
+
+endstream
+endobj
+3059 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595.28 841.89]
+/CropBox [0 0 595.28 841.89]
+/BleedBox [0 0 595.28 841.89]
+/TrimBox [0 0 595.28 841.89]
+/ArtBox [0 0 595.28 841.89]
+/Contents 3058 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 31 0 R
+/F1.0 10 0 R
+/F4.0 37 0 R
+/F1.1 40 0 R
+/F3.0 35 0 R
+>>
+/XObject << /Stamp2 5008 0 R
+>>
+>>
+>>
+endobj
+3060 0 obj
+[3059 0 R /XYZ 0 841.89 null]
+endobj
+3061 0 obj
+[3059 0 R /XYZ 0 653.55 null]
+endobj
+3062 0 obj
+[3059 0 R /XYZ 0 360.55 null]
+endobj
+3063 0 obj
+[3059 0 R /XYZ 0 203.41 null]
+endobj
+3064 0 obj
+<< /Length 9014
+>>
+stream
+q
+/DeviceRGB cs
 0.2 0.2 0.2 scn
+/DeviceRGB CS
 0.2 0.2 0.2 SCN
 
 0.7467 Tw
 
 BT
-48.24 121.396 Td
+48.24 794.676 Td
 /F1.0 10.5 Tf
 [<54> 29.7852 <6f20636f6e6669677572652074686520444e5320696e7465726661636520666f722074686520636c69656e742c20636f6e6669677572652074686520666f6c6c6f77696e67206f7074696f6e616c2070726f7065727469657320696e20>] TJ
 ET
@@ -606561,7 +606682,7 @@ ET
 0.7467 Tw
 
 BT
-515.477 121.396 Td
+515.477 794.676 Td
 /F3.0 10.5 Tf
 <68626173652d> Tj
 ET
@@ -606574,7 +606695,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 105.616 Td
+48.24 778.896 Td
 /F3.0 10.5 Tf
 <736974652e786d6c> Tj
 ET
@@ -606585,7 +606706,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-86.271 105.616 Td
+86.271 778.896 Td
 /F1.0 10.5 Tf
 <2e> Tj
 ET
@@ -606598,7 +606719,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 77.836 Td
+56.8805 751.116 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -606611,7 +606732,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-66.24 80.02 Td
+66.24 753.3 Td
 /F4.0 10.5 Tf
 <68626173652e636c69656e742e646e732e696e74657266616365> Tj
 ET
@@ -606624,7 +606745,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-56.8805 59.836 Td
+56.8805 733.116 Td
 /F1.0 10.5 Tf
 <a5> Tj
 ET
@@ -606637,78 +606758,18 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-66.24 62.02 Td
+66.24 735.3 Td
 /F4.0 10.5 Tf
 <68626173652e636c69656e742e646e732e6e616d65736572766572> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-q
-0.0 0.0 0.0 scn
-0.0 0.0 0.0 SCN
-1 w
-0 J
-0 j
-[] 0 d
-/Stamp2 Do
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-49.24 14.388 Td
-/F1.0 9 Tf
-<353232> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-Q
-Q
-
-endstream
-endobj
-3060 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 595.28 841.89]
-/CropBox [0 0 595.28 841.89]
-/BleedBox [0 0 595.28 841.89]
-/TrimBox [0 0 595.28 841.89]
-/ArtBox [0 0 595.28 841.89]
-/Contents 3059 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F1.0 10 0 R
-/F4.0 37 0 R
-/F2.0 31 0 R
-/F3.0 35 0 R
->>
-/XObject << /Stamp2 5008 0 R
->>
->>
->>
-endobj
-3061 0 obj
-[3060 0 R /XYZ 0 714.34 null]
-endobj
-3062 0 obj
-[3060 0 R /XYZ 0 421.34 null]
-endobj
-3063 0 obj
-[3060 0 R /XYZ 0 279.98 null]
-endobj
-3064 0 obj
-<< /Length 13296
->>
-stream
-q
-/DeviceRGB cs
-0.2 0.2 0.2 scn
-/DeviceRGB CS
-0.2 0.2 0.2 SCN
-
-BT
-48.24 794.5242 Td
+48.24 709.7142 Td
 /F3.0 9.975 Tf
 [<4578616d706c652034302e2043616e61727920696e2061204b> 20.0195 <65726265726f732d456e61626c656420436c7573746572>] TJ
 ET
@@ -606717,28 +606778,28 @@ ET
 0.0 0.0 0.0 scn
 q
 1.0 1.0 1.0 scn
-52.24 786.899 m
-543.04 786.899 l
-545.2491 786.899 547.04 785.1081 547.04 782.899 c
-547.04 466.539 l
-547.04 464.3299 545.2491 462.539 543.04 462.539 c
-52.24 462.539 l
-50.0309 462.539 48.24 464.3299 48.24 466.539 c
-48.24 782.899 l
-48.24 785.1081 50.0309 786.899 52.24 786.899 c
+52.24 702.089 m
+543.04 702.089 l
+545.2491 702.089 547.04 700.2981 547.04 698.089 c
+547.04 381.729 l
+547.04 379.5199 545.2491 377.729 543.04 377.729 c
+52.24 377.729 l
+50.0309 377.729 48.24 379.5199 48.24 381.729 c
+48.24 698.089 l
+48.24 700.2981 50.0309 702.089 52.24 702.089 c
 h
 f
 0.9333 0.9333 0.9333 SCN
 0.75 w
-52.24 786.899 m
-543.04 786.899 l
-545.2491 786.899 547.04 785.1081 547.04 782.899 c
-547.04 466.539 l
-547.04 464.3299 545.2491 462.539 543.04 462.539 c
-52.24 462.539 l
-50.0309 462.539 48.24 464.3299 48.24 466.539 c
-48.24 782.899 l
-48.24 785.1081 50.0309 786.899 52.24 786.899 c
+52.24 702.089 m
+543.04 702.089 l
+545.2491 702.089 547.04 700.2981 547.04 698.089 c
+547.04 381.729 l
+547.04 379.5199 545.2491 377.729 543.04 377.729 c
+52.24 377.729 l
+50.0309 377.729 48.24 379.5199 48.24 381.729 c
+48.24 698.089 l
+48.24 700.2981 50.0309 702.089 52.24 702.089 c
 h
 S
 Q
@@ -606746,7 +606807,7 @@ Q
 0.2 0.2 0.2 SCN
 
 BT
-60.24 762.935 Td
+60.24 678.125 Td
 /F1.0 10.5 Tf
 <54686973206578616d706c652073686f77732065616368206f66207468652070726f7065727469657320776974682076616c69642076616c7565732e> Tj
 ET
@@ -606755,28 +606816,28 @@ ET
 0.0 0.0 0.0 scn
 q
 0.9608 0.9608 0.9608 scn
-64.24 747.119 m
-531.04 747.119 l
-533.2491 747.119 535.04 745.3281 535.04 743.119 c
-535.04 478.539 l
-535.04 476.3299 533.2491 474.539 531.04 474.539 c
-64.24 474.539 l
-62.0309 474.539 60.24 476.3299 60.24 478.539 c
-60.24 743.119 l
-60.24 745.3281 62.0309 747.119 64.24 747.119 c
+64.24 662.309 m
+531.04 662.309 l
+533.2491 662.309 535.04 660.5181 535.04 658.309 c
+535.04 393.729 l
+535.04 391.5199 533.2491 389.729 531.04 389.729 c
+64.24 389.729 l
+62.0309 389.729 60.24 391.5199 60.24 393.729 c
+60.24 658.309 l
+60.24 660.5181 62.0309 662.309 64.24 662.309 c
 h
 f
 0.8 0.8 0.8 SCN
 0.75 w
-64.24 747.119 m
-531.04 747.119 l
-533.2491 747.119 535.04 745.3281 535.04 743.119 c
-535.04 478.539 l
-535.04 476.3299 533.2491 474.539 531.04 474.539 c
-64.24 474.539 l
-62.0309 474.539 60.24 476.3299 60.24 478.539 c
-60.24 743.119 l
-60.24 745.3281 62.0309 747.119 64.24 747.119 c
+64.24 662.309 m
+531.04 662.309 l
+533.2491 662.309 535.04 660.5181 535.04 658.309 c
+535.04 393.729 l
+535.04 391.5199 533.2491 389.729 531.04 389.729 c
+64.24 389.729 l
+62.0309 389.729 60.24 391.5199 60.24 393.729 c
+60.24 658.309 l
+60.24 660.5181 62.0309 662.309 64.24 662.309 c
 h
 S
 Q
@@ -606784,7 +606845,7 @@ Q
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 724.294 Td
+71.24 639.484 Td
 /F4.0 11 Tf
 <3c70726f70657274793e> Tj
 ET
@@ -606795,7 +606856,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 709.554 Td
+71.24 624.744 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -606806,7 +606867,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 709.554 Td
+82.24 624.744 Td
 /F4.0 11 Tf
 <3c6e616d653e> Tj
 ET
@@ -606817,7 +606878,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-115.24 709.554 Td
+115.24 624.744 Td
 /F4.0 11 Tf
 <68626173652e636c69656e742e6b65726265726f732e7072696e636970616c> Tj
 ET
@@ -606828,7 +606889,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-285.74 709.554 Td
+285.74 624.744 Td
 /F4.0 11 Tf
 <3c2f6e616d653e> Tj
 ET
@@ -606839,7 +606900,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 694.814 Td
+71.24 610.004 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -606850,7 +606911,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 694.814 Td
+82.24 610.004 Td
 /F4.0 11 Tf
 <3c76616c75653e> Tj
 ET
@@ -606861,7 +606922,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-120.74 694.814 Td
+120.74 610.004 Td
 /F4.0 11 Tf
 <68626173652f5f484f535440594f55522d5245414c4d2e434f4d> Tj
 ET
@@ -606872,7 +606933,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-263.74 694.814 Td
+263.74 610.004 Td
 /F4.0 11 Tf
 <3c2f76616c75653e> Tj
 ET
@@ -606883,7 +606944,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 680.074 Td
+71.24 595.264 Td
 /F4.0 11 Tf
 <3c2f70726f70657274793e> Tj
 ET
@@ -606894,7 +606955,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 665.334 Td
+71.24 580.524 Td
 /F4.0 11 Tf
 <3c70726f70657274793e> Tj
 ET
@@ -606905,7 +606966,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 650.594 Td
+71.24 565.784 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -606916,7 +606977,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 650.594 Td
+82.24 565.784 Td
 /F4.0 11 Tf
 <3c6e616d653e> Tj
 ET
@@ -606927,7 +606988,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-115.24 650.594 Td
+115.24 565.784 Td
 /F4.0 11 Tf
 <68626173652e636c69656e742e6b65797461622e66696c65> Tj
 ET
@@ -606938,7 +606999,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-247.24 650.594 Td
+247.24 565.784 Td
 /F4.0 11 Tf
 <3c2f6e616d653e> Tj
 ET
@@ -606949,7 +607010,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 635.854 Td
+71.24 551.044 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -606960,7 +607021,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 635.854 Td
+82.24 551.044 Td
 /F4.0 11 Tf
 <3c76616c75653e> Tj
 ET
@@ -606971,7 +607032,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-120.74 635.854 Td
+120.74 551.044 Td
 /F4.0 11 Tf
 <2f6574632f68626173652f636f6e662f6b65797461622e6b726235> Tj
 ET
@@ -606982,7 +607043,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-269.24 635.854 Td
+269.24 551.044 Td
 /F4.0 11 Tf
 <3c2f76616c75653e> Tj
 ET
@@ -606993,7 +607054,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 621.114 Td
+71.24 536.304 Td
 /F4.0 11 Tf
 <3c2f70726f70657274793e> Tj
 ET
@@ -607004,7 +607065,7 @@ ET
 0.6 0.6 0.6 SCN
 
 BT
-71.24 606.374 Td
+71.24 521.564 Td
 /F4.0 11 Tf
 <3c212d2d206f7074696f6e616c20706172616d73202d2d3e> Tj
 ET
@@ -607015,7 +607076,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 591.634 Td
+71.24 506.824 Td
 /F4.0 11 Tf
 <3c70726f70657274793e> Tj
 ET
@@ -607026,7 +607087,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 576.894 Td
+71.24 492.084 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -607037,7 +607098,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 576.894 Td
+82.24 492.084 Td
 /F4.0 11 Tf
 <3c6e616d653e> Tj
 ET
@@ -607048,7 +607109,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-115.24 576.894 Td
+115.24 492.084 Td
 /F4.0 11 Tf
 <68626173652e636c69656e742e646e732e696e74657266616365> Tj
 ET
@@ -607059,7 +607120,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-258.24 576.894 Td
+258.24 492.084 Td
 /F4.0 11 Tf
 <3c2f6e616d653e> Tj
 ET
@@ -607070,7 +607131,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 562.154 Td
+71.24 477.344 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -607081,7 +607142,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 562.154 Td
+82.24 477.344 Td
 /F4.0 11 Tf
 <3c76616c75653e> Tj
 ET
@@ -607092,7 +607153,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-120.74 562.154 Td
+120.74 477.344 Td
 /F4.0 11 Tf
 <64656661756c74> Tj
 ET
@@ -607103,7 +607164,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-159.24 562.154 Td
+159.24 477.344 Td
 /F4.0 11 Tf
 <3c2f76616c75653e> Tj
 ET
@@ -607114,7 +607175,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 547.414 Td
+71.24 462.604 Td
 /F4.0 11 Tf
 <3c2f70726f70657274793e> Tj
 ET
@@ -607125,7 +607186,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 532.674 Td
+71.24 447.864 Td
 /F4.0 11 Tf
 <3c70726f70657274793e> Tj
 ET
@@ -607136,7 +607197,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 517.934 Td
+71.24 433.124 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -607147,7 +607208,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 517.934 Td
+82.24 433.124 Td
 /F4.0 11 Tf
 <3c6e616d653e> Tj
 ET
@@ -607158,7 +607219,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-115.24 517.934 Td
+115.24 433.124 Td
 /F4.0 11 Tf
 <68626173652e636c69656e742e646e732e6e616d65736572766572> Tj
 ET
@@ -607169,7 +607230,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-263.74 517.934 Td
+263.74 433.124 Td
 /F4.0 11 Tf
 <3c2f6e616d653e> Tj
 ET
@@ -607180,7 +607241,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-71.24 503.194 Td
+71.24 418.384 Td
 /F4.0 11 Tf
 <ca20> Tj
 ET
@@ -607191,7 +607252,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-82.24 503.194 Td
+82.24 418.384 Td
 /F4.0 11 Tf
 <3c76616c75653e> Tj
 ET
@@ -607202,7 +607263,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-120.74 503.194 Td
+120.74 418.384 Td
 /F4.0 11 Tf
 <64656661756c74> Tj
 ET
@@ -607213,7 +607274,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-159.24 503.194 Td
+159.24 418.384 Td
 /F4.0 11 Tf
 <3c2f76616c75653e> Tj
 ET
@@ -607224,7 +607285,7 @@ ET
 0.1843 0.4353 0.6235 SCN
 
 BT
-71.24 488.454 Td
+71.24 403.644 Td
 /F4.0 11 Tf
 <3c2f70726f70657274793e> Tj
 ET
@@ -607235,7 +607296,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 426.515 Td
+48.24 341.705 Td
 /F2.0 18 Tf
 <3134392e322e20526567696f6e53706c6974746572> Tj
 ET
@@ -607243,37 +607304,93 @@ ET
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 q
+0.0 0.0 0.0 scn
+0.0 0.0 0.0 SCN
+1 w
+0 J
+0 j
+[] 0 d
+/Stamp1 Do
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+530.947 14.388 Td
+/F1.0 9 Tf
+<353233> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+Q
+Q
+
+endstream
+endobj
+3065 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595.28 841.89]
+/CropBox [0 0 595.28 841.89]
+/BleedBox [0 0 595.28 841.89]
+/TrimBox [0 0 595.28 841.89]
+/ArtBox [0 0 595.28 841.89]
+/Contents 3064 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 10 0 R
+/F3.0 35 0 R
+/F4.0 37 0 R
+/F2.0 31 0 R
+>>
+/XObject << /Stamp1 5007 0 R
+>>
+>>
+>>
+endobj
+3066 0 obj
+[3065 0 R /XYZ 0 365.729 null]
+endobj
+3067 0 obj
+<< /Length 11716
+>>
+stream
+q
+q
+/DeviceRGB cs
 0.9608 0.9608 0.9608 scn
-52.24 410.459 m
-543.04 410.459 l
-545.2491 410.459 547.04 408.6681 547.04 406.459 c
-547.04 68.179 l
-547.04 65.9699 545.2491 64.179 543.04 64.179 c
-52.24 64.179 l
-50.0309 64.179 48.24 65.9699 48.24 68.179 c
-48.24 406.459 l
-48.24 408.6681 50.0309 410.459 52.24 410.459 c
+52.24 805.89 m
+543.04 805.89 l
+545.2491 805.89 547.04 804.0991 547.04 801.89 c
+547.04 463.61 l
+547.04 461.4009 545.2491 459.61 543.04 459.61 c
+52.24 459.61 l
+50.0309 459.61 48.24 461.4009 48.24 463.61 c
+48.24 801.89 l
+48.24 804.0991 50.0309 805.89 52.24 805.89 c
 h
 f
+/DeviceRGB CS
 0.8 0.8 0.8 SCN
 0.75 w
-52.24 410.459 m
-543.04 410.459 l
-545.2491 410.459 547.04 408.6681 547.04 406.459 c
-547.04 68.179 l
-547.04 65.9699 545.2491 64.179 543.04 64.179 c
-52.24 64.179 l
-50.0309 64.179 48.24 65.9699 48.24 68.179 c
-48.24 406.459 l
-48.24 408.6681 50.0309 410.459 52.24 410.459 c
+52.24 805.89 m
+543.04 805.89 l
+545.2491 805.89 547.04 804.0991 547.04 801.89 c
+547.04 463.61 l
+547.04 461.4009 545.2491 459.61 543.04 459.61 c
+52.24 459.61 l
+50.0309 459.61 48.24 461.4009 48.24 463.61 c
+48.24 801.89 l
+48.24 804.0991 50.0309 805.89 52.24 805.89 c
 h
 S
 Q
+/DeviceRGB cs
 0.2 0.2 0.2 scn
+/DeviceRGB CS
 0.2 0.2 0.2 SCN
 
 BT
-59.24 387.634 Td
+59.24 783.065 Td
 /F4.0 11 Tf
 <75736167653a2062696e2f686261736520726567696f6e73706c6974746572203c5441424c453e203c53504c4954414c474f524954484d3e> Tj
 ET
@@ -607284,7 +607401,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 372.894 Td
+59.24 768.325 Td
 /F4.0 11 Tf
 <53504c4954414c474f524954484d20697320746865206a61766120636c617373206e616d65206f66206120636c61737320696d706c656d656e74696e67> Tj
 ET
@@ -607295,7 +607412,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 358.154 Td
+59.24 753.585 Td
 /F4.0 11 Tf
 <ca20202020202020202020202020202020202020202053706c6974416c676f726974686d2c206f72206f6e65206f6620746865207370656369616c20737472696e6773> Tj
 ET
@@ -607306,7 +607423,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 343.414 Td
+59.24 738.845 Td
 /F4.0 11 Tf
 <ca202020202020202020202020202020202020202020486578537472696e6753706c6974206f7220446563696d616c537472696e6753706c6974206f72> Tj
 ET
@@ -607317,7 +607434,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 328.674 Td
+59.24 724.105 Td
 /F4.0 11 Tf
 <ca202020202020202020202020202020202020202020556e69666f726d53706c69742c20776869636820617265206275696c742d696e2073706c697420616c676f726974686d732e> Tj
 ET
@@ -607328,7 +607445,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 313.934 Td
+59.24 709.365 Td
 /F4.0 11 Tf
 <ca202020202020202020202020202020202020202020486578537472696e6753706c697420747265617473206b6579732061732068657861646563696d616c2041534349492c20616e64> Tj
 ET
@@ -607339,7 +607456,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 299.194 Td
+59.24 694.625 Td
 /F4.0 11 Tf
 <ca202020202020202020202020202020202020202020446563696d616c537472696e6753706c697420747265617473206b65797320617320646563696d616c2041534349492c20616e64> Tj
 ET
@@ -607350,7 +607467,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 284.454 Td
+59.24 679.885 Td
 /F4.0 11 Tf
 <ca202020202020202020202020202020202020202020556e69666f726d53706c697420747265617473206b657973206173206172626974726172792062797465732e> Tj
 ET
@@ -607361,7 +607478,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 269.714 Td
+59.24 665.145 Td
 /F4.0 11 Tf
 <ca2d63203c726567696f6e20636f756e743e20202020202020204372656174652061206e6577207461626c6520776974682061207072652d73706c6974206e756d626572206f66> Tj
 ET
@@ -607372,7 +607489,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 254.974 Td
+59.24 650.405 Td
 /F4.0 11 Tf
 <ca20202020202020202020202020202020202020202020202020726567696f6e73> Tj
 ET
@@ -607383,7 +607500,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 240.234 Td
+59.24 635.665 Td
 /F4.0 11 Tf
 <ca2d44203c70726f70657274793d76616c75653e2020202020204f7665727269646520484261736520436f6e66696775726174696f6e2053657474696e6773> Tj
 ET
@@ -607394,7 +607511,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 225.494 Td
+59.24 620.925 Td
 /F4.0 11 Tf
 <ca2d66203c66616d696c793a66616d696c793a2e2e2e3e202020436f6c756d6e2046616d696c69657320746f206372656174652077697468206e6577207461626c652e> Tj
 ET
@@ -607405,7 +607522,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 210.754 Td
+59.24 606.185 Td
 /F4.0 11 Tf
 <ca2020202020202020202020202020202020202020202020202052657175697265642077697468202d63> Tj
 ET
@@ -607416,7 +607533,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 196.014 Td
+59.24 591.445 Td
 /F4.0 11 Tf
 <ca2020202d2d6669727374726f77203c6172673e202020202020466972737420526f7720696e205461626c6520666f722053706c697420416c676f726974686d> Tj
 ET
@@ -607427,7 +607544,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 181.274 Td
+59.24 576.705 Td
 /F4.0 11 Tf
 <ca2d6820202020202020202020202020202020202020202020205072696e7420746869732075736167652068656c70> Tj
 ET
@@ -607438,7 +607555,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 166.534 Td
+59.24 561.965 Td
 /F4.0 11 Tf
 <ca2020202d2d6c617374726f77203c6172673e202020202020204c61737420526f7720696e205461626c6520666f722053706c697420416c676f726974686d> Tj
 ET
@@ -607449,7 +607566,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 151.794 Td
+59.24 547.225 Td
 /F4.0 11 Tf
 <ca2d6f203c636f756e743e2020202020202020202020202020204d6178206f75747374616e64696e672073706c6974732074686174206861766520756e66696e6973686564> Tj
 ET
@@ -607460,7 +607577,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 137.054 Td
+59.24 532.485 Td
 /F4.0 11 Tf
 <ca202020202020202020202020202020202020202020202020206d616a6f7220636f6d70616374696f6e73> Tj
 ET
@@ -607471,7 +607588,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 122.314 Td
+59.24 517.745 Td
 /F4.0 11 Tf
 <ca2d722020202020202020202020202020202020202020202020506572666f726d206120726f6c6c696e672073706c6974206f6620616e206578697374696e6720726567696f6e> Tj
 ET
@@ -607482,7 +607599,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 107.574 Td
+59.24 503.005 Td
 /F4.0 11 Tf
 <ca2020202d2d7269736b79202020202020202020202020202020536b697020766572696669636174696f6e20737465707320746f20636f6d706c657465> Tj
 ET
@@ -607493,7 +607610,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 92.834 Td
+59.24 488.265 Td
 /F4.0 11 Tf
 <ca20202020202020202020202020202020202020202020202020717569636b6c792e205354524f4e474c5920444953434f55524147454420666f722070726f64756374696f6e> Tj
 ET
@@ -607504,72 +607621,18 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-59.24 78.094 Td
+59.24 473.525 Td
 /F4.0 11 Tf
 <ca2020202020202020202020202020202020202020202020202073797374656d732e> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-q
-0.0 0.0 0.0 scn
-0.0 0.0 0.0 SCN
-1 w
-0 J
-0 j
-[] 0 d
-/Stamp1 Do
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-530.947 14.388 Td
-/F1.0 9 Tf
-<353233> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-Q
-Q
-
-endstream
-endobj
-3065 0 obj
-<< /

<TRUNCATED>

[06/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        LOG.debug("The targeted table was di

<TRUNCATED>

[22/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html
index c2698b3..9142fe1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html
@@ -207,307 +207,309 @@
 <span class="sourceLineNo">199</span>      }<a name="line.199"></a>
 <span class="sourceLineNo">200</span>      tmp = fileInfo.get(TIMERANGE_KEY);<a name="line.200"></a>
 <span class="sourceLineNo">201</span>      fd.latestPutTs = tmp == null ? HConstants.LATEST_TIMESTAMP: TimeRangeTracker.parseFrom(tmp).getMax();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, encoding={}, seqNum={}{}",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          keyCount,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          r.getBloomFilterType().toString(),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          seqNum,<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return fd;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * Creates file scanners for compaction.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param filesToCompact Files.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @return Scanners.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      smallestReadPoint);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private long getSmallestReadPoint() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return store.getSmallestReadPoint();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected interface InternalScannerFactory {<a name="line.229"></a>
+<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, "<a name="line.202"></a>
+<span class="sourceLineNo">203</span>              + "encoding={}, compression={}, seqNum={}{}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          keyCount,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          r.getBloomFilterType().toString(),<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          compactionCompression,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          seqNum,<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return fd;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * Creates file scanners for compaction.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @param filesToCompact Files.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return Scanners.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      smallestReadPoint);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private long getSmallestReadPoint() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return store.getSmallestReadPoint();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
 <span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.231"></a>
+<span class="sourceLineNo">231</span>  protected interface InternalScannerFactory {<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.237"></a>
+<span class="sourceLineNo">233</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>    @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        fd.earliestPutTs);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  };<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Creates a writer for a new file in a temporary directory.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param fd The file details.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @throws IOException if creation failed<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      User user) throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    if (store.getCoprocessorHost() == null) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return store.getScanInfo();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      request, user);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  /**<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param request Compaction request.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param scanType Scan type.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param scanner The default scanner created for compaction.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InternalScanner scanner, User user) throws IOException {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    if (store.getCoprocessorHost() == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      return scanner;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      request, user);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>    // Find the smallest read point across all the Scanners.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    T writer = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    boolean dropCache;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      dropCache = this.dropCacheMajor;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMinor;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    List&lt;StoreFileScanner&gt; scanners =<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    InternalScanner scanner = null;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    boolean finished = false;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      boolean cleanSeqId = false;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        cleanSeqId = true;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (!finished) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    } finally {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Closeables.close(scanner, true);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (!finished &amp;&amp; writer != null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        abortWriter(writer);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assert finished : "We should have exited the method on all error paths";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return commitWriter(writer, fd, request);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      CompactionRequestImpl request) throws IOException;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.345"></a>
+<span class="sourceLineNo">239</span>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>    @Override<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    @Override<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        fd.earliestPutTs);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  };<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>  /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * Creates a writer for a new file in a temporary directory.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @param fd The file details.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @throws IOException if creation failed<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throws IOException {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      User user) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (store.getCoprocessorHost() == null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      return store.getScanInfo();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      request, user);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  /**<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param request Compaction request.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param scanType Scan type.<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @param scanner The default scanner created for compaction.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      InternalScanner scanner, User user) throws IOException {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    if (store.getCoprocessorHost() == null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      return scanner;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      request, user);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    // Find the smallest read point across all the Scanners.<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    T writer = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    boolean dropCache;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMajor;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      dropCache = this.dropCacheMinor;<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>    List&lt;StoreFileScanner&gt; scanners =<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    InternalScanner scanner = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    boolean finished = false;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      boolean cleanSeqId = false;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        cleanSeqId = true;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (!finished) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.330"></a>
+<span class="sourceLineNo">331</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } finally {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      Closeables.close(scanner, true);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      if (!finished &amp;&amp; writer != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        abortWriter(writer);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    assert finished : "We should have exited the method on all error paths";<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return commitWriter(writer, fd, request);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      CompactionRequestImpl request) throws IOException;<a name="line.345"></a>
 <span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Performs the compaction.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * @param fd FileDetails of cell sink writer<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param scanner Where to read from.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param writer Where to write to.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param smallestReadPoint Smallest read point.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *          smallestReadPoint<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param major Is a major compaction.<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param numofFilesToCompact the number of files to compact<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assert writer instanceof ShipperListener;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    long bytesWrittenProgressForLog = 0;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // we have to use a do/while loop.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    long lastMillis = 0;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (LOG.isDebugEnabled()) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    long now = 0;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    boolean hasMore;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    ScannerContext scannerContext =<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>    throughputController.start(compactionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      do {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        if (LOG.isDebugEnabled()) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // output to writer:<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        Cell lastCleanCell = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        long lastCleanCellSeqId = 0;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        for (Cell c : cells) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            lastCleanCell = c;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          } else {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            lastCleanCell = null;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            lastCleanCellSeqId = 0;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          writer.append(c);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          int len = KeyValueUtil.length(c);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          ++progress.currentCompactedKVs;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          progress.totalCompactedSize += len;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          bytesWrittenProgressForShippedCall += len;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (LOG.isDebugEnabled()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            bytesWrittenProgressForLog += len;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          throughputController.control(compactionName, len);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          // check periodically to see if a system stop is requested<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              if (!store.areWritesEnabled()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                progress.cancel();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                return false;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>              }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            if (lastCleanCell != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.423"></a>
-<span class="sourceLineNo">424</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.424"></a>
-<span class="sourceLineNo">425</span>              // sequence id before ShipperListener.beforeShipped<a name="line.425"></a>
-<span class="sourceLineNo">426</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            // if they are holding any.<a name="line.429"></a>
-<span class="sourceLineNo">430</span>            ((ShipperListener)writer).beforeShipped();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.435"></a>
-<span class="sourceLineNo">436</span>            // may clear prevBlocks list.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>            kvs.shipped();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        // Log the progress of long running compactions every minute if<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        // logging at DEBUG level<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        if (LOG.isDebugEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug("Compaction progress: "<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                + compactionName<a name="line.450"></a>
-<span class="sourceLineNo">451</span>                + " "<a name="line.451"></a>
-<span class="sourceLineNo">452</span>                + progress<a name="line.452"></a>
-<span class="sourceLineNo">453</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.454"></a>
-<span class="sourceLineNo">455</span>                + throughputController);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            lastMillis = now;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } while (hasMore);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    } catch (InterruptedException e) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      progress.cancel();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          + compactionName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    } finally {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      throughputController.finish(compactionName);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    progress.complete();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return true;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  /**<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * @param store store<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * @param scanners Store file scanners.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * @param scanType Scan type.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param earliestPutTs Earliest put across all files.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return A compaction scanner.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      long earliestPutTs) throws IOException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @param store The store.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * @param scanners Store file scanners.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * @param earliestPutTs Earliest put across all files.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @return A compaction scanner.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        dropDeletesFromRow, dropDeletesToRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>}<a name="line.502"></a>
+<span class="sourceLineNo">347</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Performs the compaction.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * @param fd FileDetails of cell sink writer<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * @param scanner Where to read from.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param writer Where to write to.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @param smallestReadPoint Smallest read point.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   *          smallestReadPoint<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @param major Is a major compaction.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param numofFilesToCompact the number of files to compact<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    assert writer instanceof ShipperListener;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    long bytesWrittenProgressForLog = 0;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    // we have to use a do/while loop.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    long lastMillis = 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (LOG.isDebugEnabled()) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    long now = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    boolean hasMore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    ScannerContext scannerContext =<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    throughputController.start(compactionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      do {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        if (LOG.isDebugEnabled()) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        // output to writer:<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        Cell lastCleanCell = null;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        long lastCleanCellSeqId = 0;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        for (Cell c : cells) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>            lastCleanCell = c;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          } else {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            lastCleanCell = null;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            lastCleanCellSeqId = 0;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          writer.append(c);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          int len = KeyValueUtil.length(c);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ++progress.currentCompactedKVs;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          progress.totalCompactedSize += len;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          bytesWrittenProgressForShippedCall += len;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (LOG.isDebugEnabled()) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            bytesWrittenProgressForLog += len;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          throughputController.control(compactionName, len);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          // check periodically to see if a system stop is requested<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>              if (!store.areWritesEnabled()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                progress.cancel();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                return false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>              }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>            if (lastCleanCell != null) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.426"></a>
+<span class="sourceLineNo">427</span>              // sequence id before ShipperListener.beforeShipped<a name="line.427"></a>
+<span class="sourceLineNo">428</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.430"></a>
+<span class="sourceLineNo">431</span>            // if they are holding any.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>            ((ShipperListener)writer).beforeShipped();<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.433"></a>
+<span class="sourceLineNo">434</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.434"></a>
+<span class="sourceLineNo">435</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            // may clear prevBlocks list.<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            kvs.shipped();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        // Log the progress of long running compactions every minute if<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        // logging at DEBUG level<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        if (LOG.isDebugEnabled()) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            LOG.debug("Compaction progress: "<a name="line.451"></a>
+<span class="sourceLineNo">452</span>                + compactionName<a name="line.452"></a>
+<span class="sourceLineNo">453</span>                + " "<a name="line.453"></a>
+<span class="sourceLineNo">454</span>                + progress<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.456"></a>
+<span class="sourceLineNo">457</span>                + throughputController);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            lastMillis = now;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      } while (hasMore);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } catch (InterruptedException e) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      progress.cancel();<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          + compactionName);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    } finally {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throughputController.finish(compactionName);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    progress.complete();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>  /**<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @param store store<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @param scanners Store file scanners.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * @param scanType Scan type.<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @param earliestPutTs Earliest put across all files.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return A compaction scanner.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      long earliestPutTs) throws IOException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param store The store.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @param scanners Store file scanners.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @param earliestPutTs Earliest put across all files.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * @return A compaction scanner.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        dropDeletesFromRow, dropDeletesToRow);<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>
 
 
 


[03/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
index da0a780..a09b4ea 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
@@ -384,512 +384,513 @@
 <span class="sourceLineNo">376</span>    for (Compression.Algorithm algo : COMPRESSION_ALGORITHMS) {<a name="line.376"></a>
 <span class="sourceLineNo">377</span>      for (boolean pread : new boolean[] { false, true }) {<a name="line.377"></a>
 <span class="sourceLineNo">378</span>        for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "blocks_v2_"<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              + algo + "_" + encoding.toString());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          FSDataOutputStream os = fs.create(path);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          HFileDataBlockEncoder dataBlockEncoder = (encoding != DataBlockEncoding.NONE) ?<a name="line.382"></a>
-<span class="sourceLineNo">383</span>              new HFileDataBlockEncoderImpl(encoding) : NoOpDataBlockEncoder.INSTANCE;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          HFileContext meta = new HFileContextBuilder()<a name="line.384"></a>
-<span class="sourceLineNo">385</span>                              .withCompression(algo)<a name="line.385"></a>
-<span class="sourceLineNo">386</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.386"></a>
-<span class="sourceLineNo">387</span>                              .withIncludesTags(includesTag)<a name="line.387"></a>
-<span class="sourceLineNo">388</span>                              .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.388"></a>
-<span class="sourceLineNo">389</span>                              .build();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          HFileBlock.Writer hbw = new HFileBlock.Writer(dataBlockEncoder, meta);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          long totalSize = 0;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          final List&lt;Integer&gt; encodedSizes = new ArrayList&lt;&gt;();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          final List&lt;ByteBuffer&gt; encodedBlocks = new ArrayList&lt;&gt;();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            hbw.startWriting(BlockType.DATA);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            writeTestKeyValues(hbw, blockId, includesMemstoreTS, includesTag);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            hbw.writeHeaderAndData(os);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            int headerLen = HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            byte[] encodedResultWithHeader = hbw.cloneUncompressedBufferWithHeader().array();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            final int encodedSize = encodedResultWithHeader.length - headerLen;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              // We need to account for the two-byte encoding algorithm ID that<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              // comes after the 24-byte block header but before encoded KVs.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>              headerLen += DataBlockEncoding.ID_SIZE;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>            }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>            byte[] encodedDataSection =<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                new byte[encodedResultWithHeader.length - headerLen];<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            System.arraycopy(encodedResultWithHeader, headerLen,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                encodedDataSection, 0, encodedDataSection.length);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            final ByteBuffer encodedBuf =<a name="line.410"></a>
-<span class="sourceLineNo">411</span>                ByteBuffer.wrap(encodedDataSection);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            encodedSizes.add(encodedSize);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            encodedBlocks.add(encodedBuf);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            totalSize += hbw.getOnDiskSizeWithHeader();<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          os.close();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>          FSDataInputStream is = fs.open(path);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          meta = new HFileContextBuilder()<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                .withHBaseCheckSum(true)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                .withCompression(algo)<a name="line.421"></a>
-<span class="sourceLineNo">422</span>                .withIncludesMvcc(includesMemstoreTS)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                .withIncludesTags(includesTag)<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                .build();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          HFileBlock.FSReaderImpl hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          hbr.setDataBlockEncoder(dataBlockEncoder);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          hbr.setIncludesMemStoreTS(includesMemstoreTS);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          HFileBlock blockFromHFile, blockUnpacked;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          int pos = 0;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            blockFromHFile = hbr.readBlockData(pos, -1, pread, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            blockFromHFile.sanityCheck();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            pos += blockFromHFile.getOnDiskSizeWithHeader();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            assertEquals((int) encodedSizes.get(blockId),<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              blockFromHFile.getUncompressedSizeWithoutHeader());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>            assertEquals(meta.isCompressedOrEncrypted(), !blockFromHFile.isUnpacked());<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            long packedHeapsize = blockFromHFile.heapSize();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            blockUnpacked = blockFromHFile.unpack(meta, hbr);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            assertTrue(blockUnpacked.isUnpacked());<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            if (meta.isCompressedOrEncrypted()) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>              LOG.info("packedHeapsize=" + packedHeapsize + ", unpackedHeadsize=" + blockUnpacked<a name="line.442"></a>
-<span class="sourceLineNo">443</span>                .heapSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              assertFalse(packedHeapsize == blockUnpacked.heapSize());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              assertTrue("Packed heapSize should be &lt; unpacked heapSize",<a name="line.445"></a>
-<span class="sourceLineNo">446</span>                packedHeapsize &lt; blockUnpacked.heapSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>            }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            ByteBuff actualBuffer = blockUnpacked.getBufferWithoutHeader();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              // We expect a two-byte big-endian encoding id.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              assertEquals(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>                "Unexpected first byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.452"></a>
-<span class="sourceLineNo">453</span>                Long.toHexString(0), Long.toHexString(actualBuffer.get(0)));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              assertEquals(<a name="line.454"></a>
-<span class="sourceLineNo">455</span>                "Unexpected second byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.455"></a>
-<span class="sourceLineNo">456</span>                Long.toHexString(encoding.getId()), Long.toHexString(actualBuffer.get(1)));<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              actualBuffer.position(2);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>              actualBuffer = actualBuffer.slice();<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>            ByteBuffer expectedBuffer = encodedBlocks.get(blockId);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>            expectedBuffer.rewind();<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>            // test if content matches, produce nice message<a name="line.464"></a>
-<span class="sourceLineNo">465</span>            assertBuffersEqual(new SingleByteBuff(expectedBuffer), actualBuffer, algo, encoding,<a name="line.465"></a>
-<span class="sourceLineNo">466</span>                pread);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>            // test serialized blocks<a name="line.468"></a>
-<span class="sourceLineNo">469</span>            for (boolean reuseBuffer : new boolean[] { false, true }) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>              ByteBuffer serialized = ByteBuffer.allocate(blockFromHFile.getSerializedLength());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              blockFromHFile.serialize(serialized, true);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              HFileBlock deserialized =<a name="line.472"></a>
-<span class="sourceLineNo">473</span>                  (HFileBlock) blockFromHFile.getDeserializer().deserialize(<a name="line.473"></a>
-<span class="sourceLineNo">474</span>                    new SingleByteBuff(serialized), reuseBuffer, MemoryType.EXCLUSIVE);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>              assertEquals(<a name="line.475"></a>
-<span class="sourceLineNo">476</span>                "Serialization did not preserve block state. reuseBuffer=" + reuseBuffer,<a name="line.476"></a>
-<span class="sourceLineNo">477</span>                blockFromHFile, deserialized);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>              // intentional reference comparison<a name="line.478"></a>
-<span class="sourceLineNo">479</span>              if (blockFromHFile != blockUnpacked) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>                assertEquals("Deserializaed block cannot be unpacked correctly.",<a name="line.480"></a>
-<span class="sourceLineNo">481</span>                  blockUnpacked, deserialized.unpack(meta, hbr));<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>          }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          is.close();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  static String buildMessageDetails(Algorithm compression, DataBlockEncoding encoding,<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      boolean pread) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    return String.format("compression %s, encoding %s, pread %s", compression, encoding, pread);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>  static void assertBuffersEqual(ByteBuff expectedBuffer,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      ByteBuff actualBuffer, Compression.Algorithm compression,<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      DataBlockEncoding encoding, boolean pread) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    if (!actualBuffer.equals(expectedBuffer)) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      int prefix = 0;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      int minLimit = Math.min(expectedBuffer.limit(), actualBuffer.limit());<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      while (prefix &lt; minLimit &amp;&amp;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          expectedBuffer.get(prefix) == actualBuffer.get(prefix)) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        prefix++;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      fail(String.format(<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          "Content mismatch for %s, commonPrefix %d, expected %s, got %s",<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          buildMessageDetails(compression, encoding, pread), prefix,<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          nextBytesToStr(expectedBuffer, prefix),<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          nextBytesToStr(actualBuffer, prefix)));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<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>   * Convert a few next bytes in the given buffer at the given position to<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * string. Used for error messages.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  private static String nextBytesToStr(ByteBuff buf, int pos) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    int maxBytes = buf.limit() - pos;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int numBytes = Math.min(16, maxBytes);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    return Bytes.toStringBinary(buf.array(), buf.arrayOffset() + pos,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        numBytes) + (numBytes &lt; maxBytes ? "..." : "");<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>  @Test<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  public void testPreviousOffset() throws IOException {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    testPreviousOffsetInternals();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>  protected void testPreviousOffsetInternals() throws IOException {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    // TODO: parameterize these nested loops.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    for (Compression.Algorithm algo : COMPRESSION_ALGORITHMS) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      for (boolean pread : BOOLEAN_VALUES) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        for (boolean cacheOnWrite : BOOLEAN_VALUES) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          Random rand = defaultRandom();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          LOG.info("testPreviousOffset:Compression algorithm: " + algo +<a name="line.537"></a>
-<span class="sourceLineNo">538</span>                   ", pread=" + pread +<a name="line.538"></a>
-<span class="sourceLineNo">539</span>                   ", cacheOnWrite=" + cacheOnWrite);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "prev_offset");<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          List&lt;Long&gt; expectedOffsets = new ArrayList&lt;&gt;();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          List&lt;Long&gt; expectedPrevOffsets = new ArrayList&lt;&gt;();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          List&lt;BlockType&gt; expectedTypes = new ArrayList&lt;&gt;();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          List&lt;ByteBuffer&gt; expectedContents = cacheOnWrite ? new ArrayList&lt;&gt;() : null;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          long totalSize = writeBlocks(rand, algo, path, expectedOffsets,<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              expectedPrevOffsets, expectedTypes, expectedContents);<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>          FSDataInputStream is = fs.open(path);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          HFileContext meta = new HFileContextBuilder()<a name="line.549"></a>
-<span class="sourceLineNo">550</span>                              .withHBaseCheckSum(true)<a name="line.550"></a>
-<span class="sourceLineNo">551</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.551"></a>
-<span class="sourceLineNo">552</span>                              .withIncludesTags(includesTag)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>                              .withCompression(algo).build();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>          long curOffset = 0;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>          for (int i = 0; i &lt; NUM_TEST_BLOCKS; ++i) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            if (!pread) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>              assertEquals(is.getPos(), curOffset + (i == 0 ? 0 :<a name="line.558"></a>
-<span class="sourceLineNo">559</span>                HConstants.HFILEBLOCK_HEADER_SIZE));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>            }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>            assertEquals(expectedOffsets.get(i).longValue(), curOffset);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            if (detailedLogging) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>              LOG.info("Reading block #" + i + " at offset " + curOffset);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>            HFileBlock b = hbr.readBlockData(curOffset, -1, pread, false);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>            if (detailedLogging) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>              LOG.info("Block #" + i + ": " + b);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>            }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>            assertEquals("Invalid block #" + i + "'s type:",<a name="line.570"></a>
-<span class="sourceLineNo">571</span>                expectedTypes.get(i), b.getBlockType());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            assertEquals("Invalid previous block offset for block " + i<a name="line.572"></a>
-<span class="sourceLineNo">573</span>                + " of " + "type " + b.getBlockType() + ":",<a name="line.573"></a>
-<span class="sourceLineNo">574</span>                (long) expectedPrevOffsets.get(i), b.getPrevBlockOffset());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            b.sanityCheck();<a name="line.575"></a>
-<span class="sourceLineNo">576</span>            assertEquals(curOffset, b.getOffset());<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>            // Now re-load this block knowing the on-disk size. This tests a<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            // different branch in the loader.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            HFileBlock b2 = hbr.readBlockData(curOffset, b.getOnDiskSizeWithHeader(), pread, false);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            b2.sanityCheck();<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>            assertEquals(b.getBlockType(), b2.getBlockType());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            assertEquals(b.getOnDiskSizeWithoutHeader(),<a name="line.584"></a>
-<span class="sourceLineNo">585</span>                b2.getOnDiskSizeWithoutHeader());<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            assertEquals(b.getOnDiskSizeWithHeader(),<a name="line.586"></a>
-<span class="sourceLineNo">587</span>                b2.getOnDiskSizeWithHeader());<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            assertEquals(b.getUncompressedSizeWithoutHeader(),<a name="line.588"></a>
-<span class="sourceLineNo">589</span>                b2.getUncompressedSizeWithoutHeader());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            assertEquals(b.getPrevBlockOffset(), b2.getPrevBlockOffset());<a name="line.590"></a>
-<span class="sourceLineNo">591</span>            assertEquals(curOffset, b2.getOffset());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            assertEquals(b.getBytesPerChecksum(), b2.getBytesPerChecksum());<a name="line.592"></a>
-<span class="sourceLineNo">593</span>            assertEquals(b.getOnDiskDataSizeWithHeader(),<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                         b2.getOnDiskDataSizeWithHeader());<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>            curOffset += b.getOnDiskSizeWithHeader();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>            if (cacheOnWrite) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>              // NOTE: cache-on-write testing doesn't actually involve a BlockCache. It simply<a name="line.600"></a>
-<span class="sourceLineNo">601</span>              // verifies that the unpacked value read back off disk matches the unpacked value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              // generated before writing to disk.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              b = b.unpack(meta, hbr);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              // b's buffer has header + data + checksum while<a name="line.604"></a>
-<span class="sourceLineNo">605</span>              // expectedContents have header + data only<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              ByteBuff bufRead = b.getBufferReadOnly();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>              ByteBuffer bufExpected = expectedContents.get(i);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>              boolean bytesAreCorrect = Bytes.compareTo(bufRead.array(),<a name="line.608"></a>
-<span class="sourceLineNo">609</span>                  bufRead.arrayOffset(),<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                  bufRead.limit() - b.totalChecksumBytes(),<a name="line.610"></a>
-<span class="sourceLineNo">611</span>                  bufExpected.array(), bufExpected.arrayOffset(),<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                  bufExpected.limit()) == 0;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>              String wrongBytesMsg = "";<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>              if (!bytesAreCorrect) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>                // Optimization: only construct an error message in case we<a name="line.616"></a>
-<span class="sourceLineNo">617</span>                // will need it.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>                wrongBytesMsg = "Expected bytes in block #" + i + " (algo="<a name="line.618"></a>
-<span class="sourceLineNo">619</span>                    + algo + ", pread=" + pread<a name="line.619"></a>
-<span class="sourceLineNo">620</span>                    + ", cacheOnWrite=" + cacheOnWrite + "):\n";<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                wrongBytesMsg += Bytes.toStringBinary(bufExpected.array(),<a name="line.621"></a>
-<span class="sourceLineNo">622</span>                  bufExpected.arrayOffset(), Math.min(32 + 10, bufExpected.limit()))<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                    + ", actual:\n"<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                    + Bytes.toStringBinary(bufRead.array(),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>                  bufRead.arrayOffset(), Math.min(32 + 10, bufRead.limit()));<a name="line.625"></a>
-<span class="sourceLineNo">626</span>                if (detailedLogging) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>                  LOG.warn("expected header" +<a name="line.627"></a>
-<span class="sourceLineNo">628</span>                           HFileBlock.toStringHeader(new SingleByteBuff(bufExpected)) +<a name="line.628"></a>
-<span class="sourceLineNo">629</span>                           "\nfound    header" +<a name="line.629"></a>
-<span class="sourceLineNo">630</span>                           HFileBlock.toStringHeader(bufRead));<a name="line.630"></a>
-<span class="sourceLineNo">631</span>                  LOG.warn("bufread offset " + bufRead.arrayOffset() +<a name="line.631"></a>
-<span class="sourceLineNo">632</span>                           " limit " + bufRead.limit() +<a name="line.632"></a>
-<span class="sourceLineNo">633</span>                           " expected offset " + bufExpected.arrayOffset() +<a name="line.633"></a>
-<span class="sourceLineNo">634</span>                           " limit " + bufExpected.limit());<a name="line.634"></a>
-<span class="sourceLineNo">635</span>                  LOG.warn(wrongBytesMsg);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>                }<a name="line.636"></a>
-<span class="sourceLineNo">637</span>              }<a name="line.637"></a>
-<span class="sourceLineNo">638</span>              assertTrue(wrongBytesMsg, bytesAreCorrect);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>            }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>          }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>          assertEquals(curOffset, fs.getFileStatus(path).getLen());<a name="line.642"></a>
-<span class="sourceLineNo">643</span>          is.close();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        }<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    }<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 Random defaultRandom() {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    return new Random(189237);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>  private class BlockReaderThread implements Callable&lt;Boolean&gt; {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    private final String clientId;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    private final HFileBlock.FSReader hbr;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    private final List&lt;Long&gt; offsets;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    private final List&lt;BlockType&gt; types;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    private final long fileSize;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    public BlockReaderThread(String clientId,<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        HFileBlock.FSReader hbr, List&lt;Long&gt; offsets, List&lt;BlockType&gt; types,<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        long fileSize) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      this.clientId = clientId;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      this.offsets = offsets;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      this.hbr = hbr;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      this.types = types;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      this.fileSize = fileSize;<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>    @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    public Boolean call() throws Exception {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      Random rand = new Random(clientId.hashCode());<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      long endTime = System.currentTimeMillis() + 10000;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      int numBlocksRead = 0;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      int numPositionalRead = 0;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      int numWithOnDiskSize = 0;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      while (System.currentTimeMillis() &lt; endTime) {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        int blockId = rand.nextInt(NUM_TEST_BLOCKS);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>        long offset = offsets.get(blockId);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        // now we only support concurrent read with pread = true<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        boolean pread = true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        boolean withOnDiskSize = rand.nextBoolean();<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        long expectedSize =<a name="line.683"></a>
-<span class="sourceLineNo">684</span>          (blockId == NUM_TEST_BLOCKS - 1 ? fileSize<a name="line.684"></a>
-<span class="sourceLineNo">685</span>              : offsets.get(blockId + 1)) - offset;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>        HFileBlock b;<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        try {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>          long onDiskSizeArg = withOnDiskSize ? expectedSize : -1;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          b = hbr.readBlockData(offset, onDiskSizeArg, pread, false);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        } catch (IOException ex) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          LOG.error("Error in client " + clientId + " trying to read block at "<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              + offset + ", pread=" + pread + ", withOnDiskSize=" +<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              withOnDiskSize, ex);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>          return false;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>        assertEquals(types.get(blockId), b.getBlockType());<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        assertEquals(expectedSize, b.getOnDiskSizeWithHeader());<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        assertEquals(offset, b.getOffset());<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>        ++numBlocksRead;<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        if (pread)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          ++numPositionalRead;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        if (withOnDiskSize)<a name="line.705"></a>
-<span class="sourceLineNo">706</span>          ++numWithOnDiskSize;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      }<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      LOG.info("Client " + clientId + " successfully read " + numBlocksRead +<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        " blocks (with pread: " + numPositionalRead + ", with onDiskSize " +<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        "specified: " + numWithOnDiskSize + ")");<a name="line.710"></a>
-<span class="sourceLineNo">711</span><a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return true;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>  @Test<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public void testConcurrentReading() throws Exception {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    testConcurrentReadingInternals();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void testConcurrentReadingInternals() throws IOException,<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      InterruptedException, ExecutionException {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (Compression.Algorithm compressAlgo : COMPRESSION_ALGORITHMS) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Path path = new Path(TEST_UTIL.getDataTestDir(), "concurrent_reading");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      Random rand = defaultRandom();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      List&lt;Long&gt; offsets = new ArrayList&lt;&gt;();<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      List&lt;BlockType&gt; types = new ArrayList&lt;&gt;();<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      writeBlocks(rand, compressAlgo, path, offsets, null, types, null);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FSDataInputStream is = fs.open(path);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      long fileSize = fs.getFileStatus(path).getLen();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      HFileContext meta = new HFileContextBuilder()<a name="line.732"></a>
-<span class="sourceLineNo">733</span>                          .withHBaseCheckSum(true)<a name="line.733"></a>
-<span class="sourceLineNo">734</span>                          .withIncludesMvcc(includesMemstoreTS)<a name="line.734"></a>
-<span class="sourceLineNo">735</span>                          .withIncludesTags(includesTag)<a name="line.735"></a>
-<span class="sourceLineNo">736</span>                          .withCompression(compressAlgo)<a name="line.736"></a>
-<span class="sourceLineNo">737</span>                          .build();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(is, fileSize, meta);<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>      Executor exec = Executors.newFixedThreadPool(NUM_READER_THREADS);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      ExecutorCompletionService&lt;Boolean&gt; ecs = new ExecutorCompletionService&lt;&gt;(exec);<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      for (int i = 0; i &lt; NUM_READER_THREADS; ++i) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        ecs.submit(new BlockReaderThread("reader_" + (char) ('A' + i), hbr,<a name="line.744"></a>
-<span class="sourceLineNo">745</span>            offsets, types, fileSize));<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      }<a name="line.746"></a>
-<span class="sourceLineNo">747</span><a name="line.747"></a>
-<span class="sourceLineNo">748</span>      for (int i = 0; i &lt; NUM_READER_THREADS; ++i) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        Future&lt;Boolean&gt; result = ecs.take();<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        assertTrue(result.get());<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        if (detailedLogging) {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>          LOG.info(String.valueOf(i + 1)<a name="line.752"></a>
-<span class="sourceLineNo">753</span>            + " reader threads finished successfully (algo=" + compressAlgo<a name="line.753"></a>
-<span class="sourceLineNo">754</span>            + ")");<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        }<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>      is.close();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private long writeBlocks(Random rand, Compression.Algorithm compressAlgo,<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path path, List&lt;Long&gt; expectedOffsets, List&lt;Long&gt; expectedPrevOffsets,<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      List&lt;BlockType&gt; expectedTypes, List&lt;ByteBuffer&gt; expectedContents<a name="line.764"></a>
-<span class="sourceLineNo">765</span>  ) throws IOException {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    boolean cacheOnWrite = expectedContents != null;<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    FSDataOutputStream os = fs.create(path);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    HFileContext meta = new HFileContextBuilder()<a name="line.768"></a>
-<span class="sourceLineNo">769</span>                        .withHBaseCheckSum(true)<a name="line.769"></a>
-<span class="sourceLineNo">770</span>                        .withIncludesMvcc(includesMemstoreTS)<a name="line.770"></a>
-<span class="sourceLineNo">771</span>                        .withIncludesTags(includesTag)<a name="line.771"></a>
-<span class="sourceLineNo">772</span>                        .withCompression(compressAlgo)<a name="line.772"></a>
-<span class="sourceLineNo">773</span>                        .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.773"></a>
-<span class="sourceLineNo">774</span>                        .build();<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    HFileBlock.Writer hbw = new HFileBlock.Writer(null, meta);<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    Map&lt;BlockType, Long&gt; prevOffsetByType = new HashMap&lt;&gt;();<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    long totalSize = 0;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    for (int i = 0; i &lt; NUM_TEST_BLOCKS; ++i) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      long pos = os.getPos();<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      int blockTypeOrdinal = rand.nextInt(BlockType.values().length);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      if (blockTypeOrdinal == BlockType.ENCODED_DATA.ordinal()) {<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        blockTypeOrdinal = BlockType.DATA.ordinal();<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      BlockType bt = BlockType.values()[blockTypeOrdinal];<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      DataOutputStream dos = hbw.startWriting(bt);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      int size = rand.nextInt(500);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      for (int j = 0; j &lt; size; ++j) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>        // This might compress well.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>        dos.writeShort(i + 1);<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        dos.writeInt(j + 1);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>      if (expectedOffsets != null)<a name="line.793"></a>
-<span class="sourceLineNo">794</span>        expectedOffsets.add(os.getPos());<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      if (expectedPrevOffsets != null) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        Long prevOffset = prevOffsetByType.get(bt);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        expectedPrevOffsets.add(prevOffset != null ? prevOffset : -1);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        prevOffsetByType.put(bt, os.getPos());<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      }<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>      expectedTypes.add(bt);<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>      hbw.writeHeaderAndData(os);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      totalSize += hbw.getOnDiskSizeWithHeader();<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (cacheOnWrite)<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        expectedContents.add(hbw.cloneUncompressedBufferWithHeader());<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>      if (detailedLogging) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>        LOG.info("Written block #" + i + " of type " + bt<a name="line.811"></a>
-<span class="sourceLineNo">812</span>            + ", uncompressed size " + hbw.getUncompressedSizeWithoutHeader()<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            + ", packed size " + hbw.getOnDiskSizeWithoutHeader()<a name="line.813"></a>
-<span class="sourceLineNo">814</span>            + " at offset " + pos);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      }<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    os.close();<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    LOG.info("Created a temporary file at " + path + ", "<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        + fs.getFileStatus(path).getLen() + " byte, compression=" +<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        compressAlgo);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    return totalSize;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
-<span class="sourceLineNo">823</span><a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Test<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public void testBlockHeapSize() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    testBlockHeapSizeInternals();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  protected void testBlockHeapSizeInternals() {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    if (ClassSize.is32BitJVM()) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      assertEquals(64, HFileBlock.MULTI_BYTE_BUFFER_HEAP_SIZE);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    } else {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(72, HFileBlock.MULTI_BYTE_BUFFER_HEAP_SIZE);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    }<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>    for (int size : new int[] { 100, 256, 12345 }) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      byte[] byteArr = new byte[HConstants.HFILEBLOCK_HEADER_SIZE + size];<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      ByteBuffer buf = ByteBuffer.wrap(byteArr, 0, size);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      HFileContext meta = new HFileContextBuilder()<a name="line.839"></a>
-<span class="sourceLineNo">840</span>                          .withIncludesMvcc(includesMemstoreTS)<a name="line.840"></a>
-<span class="sourceLineNo">841</span>                          .withIncludesTags(includesTag)<a name="line.841"></a>
-<span class="sourceLineNo">842</span>                          .withHBaseCheckSum(false)<a name="line.842"></a>
-<span class="sourceLineNo">843</span>                          .withCompression(Algorithm.NONE)<a name="line.843"></a>
-<span class="sourceLineNo">844</span>                          .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.844"></a>
-<span class="sourceLineNo">845</span>                          .withChecksumType(ChecksumType.NULL).build();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      HFileBlock block = new HFileBlock(BlockType.DATA, size, size, -1, buf,<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          HFileBlock.FILL_HEADER, -1, 0, -1, meta);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      long byteBufferExpectedSize = ClassSize.align(ClassSize.estimateBase(<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          new MultiByteBuff(buf).getClass(), true)<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          + HConstants.HFILEBLOCK_HEADER_SIZE + size);<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      long hfileMetaSize =  ClassSize.align(ClassSize.estimateBase(HFileContext.class, true));<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      long hfileBlockExpectedSize =<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          ClassSize.align(ClassSize.estimateBase(HFileBlock.class, true));<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      long expected = hfileBlockExpectedSize + byteBufferExpectedSize + hfileMetaSize;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      assertEquals("Block data size: " + size + ", byte buffer expected " +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>          "size: " + byteBufferExpectedSize + ", HFileBlock class expected " +<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          "size: " + hfileBlockExpectedSize + ";", expected,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          block.heapSize());<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>  }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>  @Test<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  public void testSerializeWithoutNextBlockMetadata() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    int size = 100;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    int length = HConstants.HFILEBLOCK_HEADER_SIZE + size;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    byte[] byteArr = new byte[length];<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    ByteBuffer buf = ByteBuffer.wrap(byteArr, 0, size);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    HFileContext meta = new HFileContextBuilder().build();<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    HFileBlock blockWithNextBlockMetadata = new HFileBlock(BlockType.DATA, size, size, -1, buf,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        HFileBlock.FILL_HEADER, -1, 52, -1, meta);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    HFileBlock blockWithoutNextBlockMetadata = new HFileBlock(BlockType.DATA, size, size, -1, buf,<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        HFileBlock.FILL_HEADER, -1, -1, -1, meta);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    ByteBuffer buff1 = ByteBuffer.allocate(length);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>    ByteBuffer buff2 = ByteBuffer.allocate(length);<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    blockWithNextBlockMetadata.serialize(buff1, true);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    blockWithoutNextBlockMetadata.serialize(buff2, true);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    assertNotEquals(buff1, buff2);<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    buff1.clear();<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    buff2.clear();<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    blockWithNextBlockMetadata.serialize(buff1, false);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    blockWithoutNextBlockMetadata.serialize(buff2, false);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    assertEquals(buff1, buff2);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>  }<a name="line.883"></a>
-<span class="sourceLineNo">884</span>}<a name="line.884"></a>
+<span class="sourceLineNo">379</span>          LOG.info("testDataBlockEncoding: Compression algorithm={}, pread={}, dataBlockEncoder={}",<a name="line.379"></a>
+<span class="sourceLineNo">380</span>              algo.toString(), pread, encoding);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "blocks_v2_"<a name="line.381"></a>
+<span class="sourceLineNo">382</span>              + algo + "_" + encoding.toString());<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          FSDataOutputStream os = fs.create(path);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          HFileDataBlockEncoder dataBlockEncoder = (encoding != DataBlockEncoding.NONE) ?<a name="line.384"></a>
+<span class="sourceLineNo">385</span>              new HFileDataBlockEncoderImpl(encoding) : NoOpDataBlockEncoder.INSTANCE;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          HFileContext meta = new HFileContextBuilder()<a name="line.386"></a>
+<span class="sourceLineNo">387</span>                              .withCompression(algo)<a name="line.387"></a>
+<span class="sourceLineNo">388</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.388"></a>
+<span class="sourceLineNo">389</span>                              .withIncludesTags(includesTag)<a name="line.389"></a>
+<span class="sourceLineNo">390</span>                              .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.390"></a>
+<span class="sourceLineNo">391</span>                              .build();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          HFileBlock.Writer hbw = new HFileBlock.Writer(dataBlockEncoder, meta);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          long totalSize = 0;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          final List&lt;Integer&gt; encodedSizes = new ArrayList&lt;&gt;();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          final List&lt;ByteBuffer&gt; encodedBlocks = new ArrayList&lt;&gt;();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            hbw.startWriting(BlockType.DATA);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            writeTestKeyValues(hbw, blockId, includesMemstoreTS, includesTag);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>            hbw.writeHeaderAndData(os);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            int headerLen = HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            byte[] encodedResultWithHeader = hbw.cloneUncompressedBufferWithHeader().array();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            final int encodedSize = encodedResultWithHeader.length - headerLen;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>              // We need to account for the two-byte encoding algorithm ID that<a name="line.404"></a>
+<span class="sourceLineNo">405</span>              // comes after the 24-byte block header but before encoded KVs.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>              headerLen += DataBlockEncoding.ID_SIZE;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>            }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            byte[] encodedDataSection =<a name="line.408"></a>
+<span class="sourceLineNo">409</span>                new byte[encodedResultWithHeader.length - headerLen];<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            System.arraycopy(encodedResultWithHeader, headerLen,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>                encodedDataSection, 0, encodedDataSection.length);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            final ByteBuffer encodedBuf =<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                ByteBuffer.wrap(encodedDataSection);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            encodedSizes.add(encodedSize);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            encodedBlocks.add(encodedBuf);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>            totalSize += hbw.getOnDiskSizeWithHeader();<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          os.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>          FSDataInputStream is = fs.open(path);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          meta = new HFileContextBuilder()<a name="line.421"></a>
+<span class="sourceLineNo">422</span>                .withHBaseCheckSum(true)<a name="line.422"></a>
+<span class="sourceLineNo">423</span>                .withCompression(algo)<a name="line.423"></a>
+<span class="sourceLineNo">424</span>                .withIncludesMvcc(includesMemstoreTS)<a name="line.424"></a>
+<span class="sourceLineNo">425</span>                .withIncludesTags(includesTag)<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                .build();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          HFileBlock.FSReaderImpl hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          hbr.setDataBlockEncoder(dataBlockEncoder);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          hbr.setIncludesMemStoreTS(includesMemstoreTS);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          HFileBlock blockFromHFile, blockUnpacked;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          int pos = 0;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            blockFromHFile = hbr.readBlockData(pos, -1, pread, false);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>            blockFromHFile.sanityCheck();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            pos += blockFromHFile.getOnDiskSizeWithHeader();<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            assertEquals((int) encodedSizes.get(blockId),<a name="line.437"></a>
+<span class="sourceLineNo">438</span>              blockFromHFile.getUncompressedSizeWithoutHeader());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            assertEquals(meta.isCompressedOrEncrypted(), !blockFromHFile.isUnpacked());<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            long packedHeapsize = blockFromHFile.heapSize();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>            blockUnpacked = blockFromHFile.unpack(meta, hbr);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>            assertTrue(blockUnpacked.isUnpacked());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>            if (meta.isCompressedOrEncrypted()) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>              LOG.info("packedHeapsize=" + packedHeapsize + ", unpackedHeadsize=" + blockUnpacked<a name="line.444"></a>
+<span class="sourceLineNo">445</span>                .heapSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span>              assertFalse(packedHeapsize == blockUnpacked.heapSize());<a name="line.446"></a>
+<span class="sourceLineNo">447</span>              assertTrue("Packed heapSize should be &lt; unpacked heapSize",<a name="line.447"></a>
+<span class="sourceLineNo">448</span>                packedHeapsize &lt; blockUnpacked.heapSize());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            }<a name="line.449"></a>
+<span class="sourceLineNo">450</span>            ByteBuff actualBuffer = blockUnpacked.getBufferWithoutHeader();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>              // We expect a two-byte big-endian encoding id.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>              assertEquals(<a name="line.453"></a>
+<span class="sourceLineNo">454</span>                "Unexpected first byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                Long.toHexString(0), Long.toHexString(actualBuffer.get(0)));<a name="line.455"></a>
+<span class="sourceLineNo">456</span>              assertEquals(<a name="line.456"></a>
+<span class="sourceLineNo">457</span>                "Unexpected second byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>                Long.toHexString(encoding.getId()), Long.toHexString(actualBuffer.get(1)));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>              actualBuffer.position(2);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>              actualBuffer = actualBuffer.slice();<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>            ByteBuffer expectedBuffer = encodedBlocks.get(blockId);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            expectedBuffer.rewind();<a name="line.464"></a>
+<span class="sourceLineNo">465</span><a name="line.465"></a>
+<span class="sourceLineNo">466</span>            // test if content matches, produce nice message<a name="line.466"></a>
+<span class="sourceLineNo">467</span>            assertBuffersEqual(new SingleByteBuff(expectedBuffer), actualBuffer, algo, encoding,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>                pread);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>            // test serialized blocks<a name="line.470"></a>
+<span class="sourceLineNo">471</span>            for (boolean reuseBuffer : new boolean[] { false, true }) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>              ByteBuffer serialized = ByteBuffer.allocate(blockFromHFile.getSerializedLength());<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              blockFromHFile.serialize(serialized, true);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              HFileBlock deserialized =<a name="line.474"></a>
+<span class="sourceLineNo">475</span>                  (HFileBlock) blockFromHFile.getDeserializer().deserialize(<a name="line.475"></a>
+<span class="sourceLineNo">476</span>                    new SingleByteBuff(serialized), reuseBuffer, MemoryType.EXCLUSIVE);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>              assertEquals(<a name="line.477"></a>
+<span class="sourceLineNo">478</span>                "Serialization did not preserve block state. reuseBuffer=" + reuseBuffer,<a name="line.478"></a>
+<span class="sourceLineNo">479</span>                blockFromHFile, deserialized);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>              // intentional reference comparison<a name="line.480"></a>
+<span class="sourceLineNo">481</span>              if (blockFromHFile != blockUnpacked) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>                assertEquals("Deserializaed block cannot be unpacked correctly.",<a name="line.482"></a>
+<span class="sourceLineNo">483</span>                  blockUnpacked, deserialized.unpack(meta, hbr));<a name="line.483"></a>
+<span class="sourceLineNo">484</span>              }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>          is.close();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<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>  static String buildMessageDetails(Algorithm compression, DataBlockEncoding encoding,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      boolean pread) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return String.format("compression %s, encoding %s, pread %s", compression, encoding, pread);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  static void assertBuffersEqual(ByteBuff expectedBuffer,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      ByteBuff actualBuffer, Compression.Algorithm compression,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      DataBlockEncoding encoding, boolean pread) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    if (!actualBuffer.equals(expectedBuffer)) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      int prefix = 0;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      int minLimit = Math.min(expectedBuffer.limit(), actualBuffer.limit());<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      while (prefix &lt; minLimit &amp;&amp;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          expectedBuffer.get(prefix) == actualBuffer.get(prefix)) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        prefix++;<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>      fail(String.format(<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          "Content mismatch for %s, commonPrefix %d, expected %s, got %s",<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          buildMessageDetails(compression, encoding, pread), prefix,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          nextBytesToStr(expectedBuffer, prefix),<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          nextBytesToStr(actualBuffer, prefix)));<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>  /**<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * Convert a few next bytes in the given buffer at the given position to<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * string. Used for error messages.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   */<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static String nextBytesToStr(ByteBuff buf, int pos) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    int maxBytes = buf.limit() - pos;<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    int numBytes = Math.min(16, maxBytes);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    return Bytes.toStringBinary(buf.array(), buf.arrayOffset() + pos,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        numBytes) + (numBytes &lt; maxBytes ? "..." : "");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  @Test<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  public void testPreviousOffset() throws IOException {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    testPreviousOffsetInternals();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>  protected void testPreviousOffsetInternals() throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    // TODO: parameterize these nested loops.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    for (Compression.Algorithm algo : COMPRESSION_ALGORITHMS) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      for (boolean pread : BOOLEAN_VALUES) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (boolean cacheOnWrite : BOOLEAN_VALUES) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          Random rand = defaultRandom();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          LOG.info("testPreviousOffset: Compression algorithm={}, pread={}, cacheOnWrite={}",<a name="line.539"></a>
+<span class="sourceLineNo">540</span>              algo.toString(), pread, cacheOnWrite);<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "prev_offset");<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          List&lt;Long&gt; expectedOffsets = new ArrayList&lt;&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          List&lt;Long&gt; expectedPrevOffsets = new ArrayList&lt;&gt;();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          List&lt;BlockType&gt; expectedTypes = new ArrayList&lt;&gt;();<a name="line.544"></a>
+<span class="sourceLineNo">545</span>          List&lt;ByteBuffer&gt; expectedContents = cacheOnWrite ? new ArrayList&lt;&gt;() : null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          long totalSize = writeBlocks(rand, algo, path, expectedOffsets,<a name="line.546"></a>
+<span class="sourceLineNo">547</span>              expectedPrevOffsets, expectedTypes, expectedContents);<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>          FSDataInputStream is = fs.open(path);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          HFileContext meta = new HFileContextBuilder()<a name="line.550"></a>
+<span class="sourceLineNo">551</span>                              .withHBaseCheckSum(true)<a name="line.551"></a>
+<span class="sourceLineNo">552</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.552"></a>
+<span class="sourceLineNo">553</span>                              .withIncludesTags(includesTag)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>                              .withCompression(algo).build();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          long curOffset = 0;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          for (int i = 0; i &lt; NUM_TEST_BLOCKS; ++i) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>            if (!pread) {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>              assertEquals(is.getPos(), curOffset + (i == 0 ? 0 :<a name="line.559"></a>
+<span class="sourceLineNo">560</span>                HConstants.HFILEBLOCK_HEADER_SIZE));<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>            assertEquals(expectedOffsets.get(i).longValue(), curOffset);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>            if (detailedLogging) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>              LOG.info("Reading block #" + i + " at offset " + curOffset);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>            HFileBlock b = hbr.readBlockData(curOffset, -1, pread, false);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>            if (detailedLogging) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>              LOG.info("Block #" + i + ": " + b);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>            }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>            assertEquals("Invalid block #" + i + "'s type:",<a name="line.571"></a>
+<span class="sourceLineNo">572</span>                expectedTypes.get(i), b.getBlockType());<a name="line.572"></a>
+<span class="sourceLineNo">573</span>            assertEquals("Invalid previous block offset for block " + i<a name="line.573"></a>
+<span class="sourceLineNo">574</span>                + " of " + "type " + b.getBlockType() + ":",<a name="line.574"></a>
+<span class="sourceLineNo">575</span>                (long) expectedPrevOffsets.get(i), b.getPrevBlockOffset());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>            b.sanityCheck();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>            assertEquals(curOffset, b.getOffset());<a name="line.577"></a>
+<span class="sourceLineNo">578</span><a name="line.578"></a>
+<span class="sourceLineNo">579</span>            // Now re-load this block knowing the on-disk size. This tests a<a name="line.579"></a>
+<span class="sourceLineNo">580</span>            // different branch in the loader.<a name="line.580"></a>
+<span class="sourceLineNo">581</span>            HFileBlock b2 = hbr.readBlockData(curOffset, b.getOnDiskSizeWithHeader(), pread, false);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>            b2.sanityCheck();<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>            assertEquals(b.getBlockType(), b2.getBlockType());<a name="line.584"></a>
+<span class="sourceLineNo">585</span>            assertEquals(b.getOnDiskSizeWithoutHeader(),<a name="line.585"></a>
+<span class="sourceLineNo">586</span>                b2.getOnDiskSizeWithoutHeader());<a name="line.586"></a>
+<span class="sourceLineNo">587</span>            assertEquals(b.getOnDiskSizeWithHeader(),<a name="line.587"></a>
+<span class="sourceLineNo">588</span>                b2.getOnDiskSizeWithHeader());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>            assertEquals(b.getUncompressedSizeWithoutHeader(),<a name="line.589"></a>
+<span class="sourceLineNo">590</span>                b2.getUncompressedSizeWithoutHeader());<a name="line.590"></a>
+<span class="sourceLineNo">591</span>            assertEquals(b.getPrevBlockOffset(), b2.getPrevBlockOffset());<a name="line.591"></a>
+<span class="sourceLineNo">592</span>            assertEquals(curOffset, b2.getOffset());<a name="line.592"></a>
+<span class="sourceLineNo">593</span>            assertEquals(b.getBytesPerChecksum(), b2.getBytesPerChecksum());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>            assertEquals(b.getOnDiskDataSizeWithHeader(),<a name="line.594"></a>
+<span class="sourceLineNo">595</span>                         b2.getOnDiskDataSizeWithHeader());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.596"></a>
+<span class="sourceLineNo">597</span><a name="line.597"></a>
+<span class="sourceLineNo">598</span>            curOffset += b.getOnDiskSizeWithHeader();<a name="line.598"></a>
+<span class="sourceLineNo">599</span><a name="line.599"></a>
+<span class="sourceLineNo">600</span>            if (cacheOnWrite) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>              // NOTE: cache-on-write testing doesn't actually involve a BlockCache. It simply<a name="line.601"></a>
+<span class="sourceLineNo">602</span>              // verifies that the unpacked value read back off disk matches the unpacked value<a name="line.602"></a>
+<span class="sourceLineNo">603</span>              // generated before writing to disk.<a name="line.603"></a>
+<span class="sourceLineNo">604</span>              b = b.unpack(meta, hbr);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>              // b's buffer has header + data + checksum while<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              // expectedContents have header + data only<a name="line.606"></a>
+<span class="sourceLineNo">607</span>              ByteBuff bufRead = b.getBufferReadOnly();<a name="line.607"></a>
+<span class="sourceLineNo">608</span>              ByteBuffer bufExpected = expectedContents.get(i);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>              boolean bytesAreCorrect = Bytes.compareTo(bufRead.array(),<a name="line.609"></a>
+<span class="sourceLineNo">610</span>                  bufRead.arrayOffset(),<a name="line.610"></a>
+<span class="sourceLineNo">611</span>                  bufRead.limit() - b.totalChecksumBytes(),<a name="line.611"></a>
+<span class="sourceLineNo">612</span>                  bufExpected.array(), bufExpected.arrayOffset(),<a name="line.612"></a>
+<span class="sourceLineNo">613</span>                  bufExpected.limit()) == 0;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>              String wrongBytesMsg = "";<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>              if (!bytesAreCorrect) {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>                // Optimization: only construct an error message in case we<a name="line.617"></a>
+<span class="sourceLineNo">618</span>                // will need it.<a name="line.618"></a>
+<span class="sourceLineNo">619</span>                wrongBytesMsg = "Expected bytes in block #" + i + " (algo="<a name="line.619"></a>
+<span class="sourceLineNo">620</span>                    + algo + ", pread=" + pread<a name="line.620"></a>
+<span class="sourceLineNo">621</span>                    + ", cacheOnWrite=" + cacheOnWrite + "):\n";<a name="line.621"></a>
+<span class="sourceLineNo">622</span>                wrongBytesMsg += Bytes.toStringBinary(bufExpected.array(),<a name="line.622"></a>
+<span class="sourceLineNo">623</span>                  bufExpected.arrayOffset(), Math.min(32 + 10, bufExpected.limit()))<a name="line.623"></a>
+<span class="sourceLineNo">624</span>                    + ", actual:\n"<a name="line.624"></a>
+<span class="sourceLineNo">625</span>                    + Bytes.toStringBinary(bufRead.array(),<a name="line.625"></a>
+<span class="sourceLineNo">626</span>                  bufRead.arrayOffset(), Math.min(32 + 10, bufRead.limit()));<a name="line.626"></a>
+<span class="sourceLineNo">627</span>                if (detailedLogging) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>                  LOG.warn("expected header" +<a name="line.628"></a>
+<span class="sourceLineNo">629</span>                           HFileBlock.toStringHeader(new SingleByteBuff(bufExpected)) +<a name="line.629"></a>
+<span class="sourceLineNo">630</span>                           "\nfound    header" +<a name="line.630"></a>
+<span class="sourceLineNo">631</span>                           HFileBlock.toStringHeader(bufRead));<a name="line.631"></a>
+<span class="sourceLineNo">632</span>                  LOG.warn("bufread offset " + bufRead.arrayOffset() +<a name="line.632"></a>
+<span class="sourceLineNo">633</span>                           " limit " + bufRead.limit() +<a name="line.633"></a>
+<span class="sourceLineNo">634</span>                           " expected offset " + bufExpected.arrayOffset() +<a name="line.634"></a>
+<span class="sourceLineNo">635</span>                           " limit " + bufExpected.limit());<a name="line.635"></a>
+<span class="sourceLineNo">636</span>                  LOG.warn(wrongBytesMsg);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>                }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>              }<a name="line.638"></a>
+<span class="sourceLineNo">639</span>              assertTrue(wrongBytesMsg, bytesAreCorrect);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>            }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>          }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>          assertEquals(curOffset, fs.getFileStatus(path).getLen());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>          is.close();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>        }<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      }<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><a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private Random defaultRandom() {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    return new Random(189237);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
+<span class="sourceLineNo">653</span><a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private class BlockReaderThread implements Callable&lt;Boolean&gt; {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    private final String clientId;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    private final HFileBlock.FSReader hbr;<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    private final List&lt;Long&gt; offsets;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    private final List&lt;BlockType&gt; types;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    private final long fileSize;<a name="line.659"></a>
+<span class="sourceLineNo">660</span><a name="line.660"></a>
+<span class="sourceLineNo">661</span>    public BlockReaderThread(String clientId,<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        HFileBlock.FSReader hbr, List&lt;Long&gt; offsets, List&lt;BlockType&gt; types,<a name="line.662"></a>
+<span class="sourceLineNo">663</span>        long fileSize) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      this.clientId = clientId;<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      this.offsets = offsets;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      this.hbr = hbr;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      this.types = types;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      this.fileSize = fileSize;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    @Override<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    public Boolean call() throws Exception {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      Random rand = new Random(clientId.hashCode());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      long endTime = System.currentTimeMillis() + 10000;<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      int numBlocksRead = 0;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      int numPositionalRead = 0;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      int numWithOnDiskSize = 0;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      while (System.currentTimeMillis() &lt; endTime) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        int blockId = rand.nextInt(NUM_TEST_BLOCKS);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>        long offset = offsets.get(blockId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>        // now we only support concurrent read with pread = true<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        boolean pread = true;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        boolean withOnDiskSize = rand.nextBoolean();<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        long expectedSize =<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          (blockId == NUM_TEST_BLOCKS - 1 ? fileSize<a name="line.685"></a>
+<span class="sourceLineNo">686</span>              : offsets.get(blockId + 1)) - offset;<a name="line.686"></a>
+<span class="sourceLineNo">687</span><a name="line.687"></a>
+<span class="sourceLineNo">688</span>        HFileBlock b;<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        try {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>          long onDiskSizeArg = withOnDiskSize ? expectedSize : -1;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          b = hbr.readBlockData(offset, onDiskSizeArg, pread, false);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>        } catch (IOException ex) {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>          LOG.error("Error in client " + clientId + " trying to read block at "<a name="line.693"></a>
+<span class="sourceLineNo">694</span>              + offset + ", pread=" + pread + ", withOnDiskSize=" +<a name="line.694"></a>
+<span class="sourceLineNo">695</span>              withOnDiskSize, ex);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          return false;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">6

<TRUNCATED>

[33/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/apidocs/org/apache/hadoop/hbase/HConstants.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/HConstants.html b/apidocs/org/apache/hadoop/hbase/HConstants.html
index 81bf813..31f191b 100644
--- a/apidocs/org/apache/hadoop/hbase/HConstants.html
+++ b/apidocs/org/apache/hadoop/hbase/HConstants.html
@@ -6240,7 +6240,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_DATA_TTL_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1328">HBASE_CANARY_WRITE_DATA_TTL_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1329">HBASE_CANARY_WRITE_DATA_TTL_KEY</a></pre>
 <div class="block">Canary config keys</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -6254,7 +6254,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1330">HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1331">HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY">Constant Field Values</a></dd>
@@ -6267,7 +6267,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1333">HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1334">HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY">Constant Field Values</a></dd>
@@ -6280,7 +6280,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_VALUE_SIZE_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1336">HBASE_CANARY_WRITE_VALUE_SIZE_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1337">HBASE_CANARY_WRITE_VALUE_SIZE_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY">Constant Field Values</a></dd>
@@ -6293,7 +6293,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1338">HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1339">HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY">Constant Field Values</a></dd>
@@ -6306,7 +6306,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_READ_RAW_SCAN_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1341">HBASE_CANARY_READ_RAW_SCAN_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1342">HBASE_CANARY_READ_RAW_SCAN_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY">Constant Field Values</a></dd>
@@ -6319,7 +6319,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_CLIENT_KEYTAB_FILE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1346">ZK_CLIENT_KEYTAB_FILE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1347">ZK_CLIENT_KEYTAB_FILE</a></pre>
 <div class="block">Configuration keys for programmatic JAAS configuration for secured ZK interaction</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -6333,7 +6333,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_CLIENT_KERBEROS_PRINCIPAL</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1347">ZK_CLIENT_KERBEROS_PRINCIPAL</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1348">ZK_CLIENT_KERBEROS_PRINCIPAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.ZK_CLIENT_KERBEROS_PRINCIPAL">Constant Field Values</a></dd>
@@ -6346,7 +6346,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_SERVER_KEYTAB_FILE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1349">ZK_SERVER_KEYTAB_FILE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1350">ZK_SERVER_KEYTAB_FILE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.ZK_SERVER_KEYTAB_FILE">Constant Field Values</a></dd>
@@ -6359,7 +6359,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_SERVER_KERBEROS_PRINCIPAL</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1350">ZK_SERVER_KERBEROS_PRINCIPAL</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1351">ZK_SERVER_KERBEROS_PRINCIPAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.ZK_SERVER_KERBEROS_PRINCIPAL">Constant Field Values</a></dd>
@@ -6372,7 +6372,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>TEMPORARY_FS_DIRECTORY_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1354">TEMPORARY_FS_DIRECTORY_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1355">TEMPORARY_FS_DIRECTORY_KEY</a></pre>
 <div class="block">Config key for hbase temporary directory in hdfs</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -6386,7 +6386,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_TEMPORARY_HDFS_DIRECTORY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1361">DEFAULT_TEMPORARY_HDFS_DIRECTORY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1362">DEFAULT_TEMPORARY_HDFS_DIRECTORY</a></pre>
 <div class="block">Don't use it! This'll get you the wrong path in a secure cluster.
  Use FileSystem.getHomeDirectory() or
  "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()</div>
@@ -6398,7 +6398,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1364">SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1365">SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT">Constant Field Values</a></dd>
@@ -6411,7 +6411,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</h4>
-<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1366">DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
+<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1367">DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT">Constant Field Values</a></dd>
@@ -6424,7 +6424,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_RESTORE_FAILSAFE_NAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1368">SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1369">SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.SNAPSHOT_RESTORE_FAILSAFE_NAME">Constant Field Values</a></dd>
@@ -6437,7 +6437,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1370">DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1371">DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME">Constant Field Values</a></dd>
@@ -6450,7 +6450,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_LOSSY_COUNTING_ERROR_RATE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1373">DEFAULT_LOSSY_COUNTING_ERROR_RATE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1374">DEFAULT_LOSSY_COUNTING_ERROR_RATE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.DEFAULT_LOSSY_COUNTING_ERROR_RATE">Constant Field Values</a></dd>
@@ -6463,7 +6463,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NOT_IMPLEMENTED</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1375">NOT_IMPLEMENTED</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1376">NOT_IMPLEMENTED</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.NOT_IMPLEMENTED">Constant Field Values</a></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/apidocs/src-html/org/apache/hadoop/hbase/HConstants.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/HConstants.html b/apidocs/src-html/org/apache/hadoop/hbase/HConstants.html
index dd675cc..333b785 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/HConstants.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/HConstants.html
@@ -1333,59 +1333,60 @@
 <span class="sourceLineNo">1325</span>    "hbase.regionserver.region.split.threads.max";<a name="line.1325"></a>
 <span class="sourceLineNo">1326</span><a name="line.1326"></a>
 <span class="sourceLineNo">1327</span>  /** Canary config keys */<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>  public static final String HBASE_CANARY_WRITE_DATA_TTL_KEY = "hbase.canary.write.data.ttl";<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span><a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY =<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      "hbase.canary.write.perserver.regions.lowerLimit";<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span><a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY =<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      "hbase.canary.write.perserver.regions.upperLimit";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span><a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  public static final String HBASE_CANARY_WRITE_VALUE_SIZE_KEY = "hbase.canary.write.value.size";<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  public static final String HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY =<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      "hbase.canary.write.table.check.period";<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span><a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  public static final String HBASE_CANARY_READ_RAW_SCAN_KEY = "hbase.canary.read.raw.enabled";<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Configuration keys for programmatic JAAS configuration for secured ZK interaction<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   */<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>  public static final String ZK_CLIENT_KEYTAB_FILE = "hbase.zookeeper.client.keytab.file";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>  public static final String ZK_CLIENT_KERBEROS_PRINCIPAL =<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      "hbase.zookeeper.client.kerberos.principal";<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>  public static final String ZK_SERVER_KEYTAB_FILE = "hbase.zookeeper.server.keytab.file";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  public static final String ZK_SERVER_KERBEROS_PRINCIPAL =<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      "hbase.zookeeper.server.kerberos.principal";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /** Config key for hbase temporary directory in hdfs */<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public static final String TEMPORARY_FS_DIRECTORY_KEY = "hbase.fs.tmp.dir";<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * Don't use it! This'll get you the wrong path in a secure cluster.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Use FileSystem.getHomeDirectory() or<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   */<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public static final String DEFAULT_TEMPORARY_HDFS_DIRECTORY = "/user/"<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      + System.getProperty("user.name") + "/hbase-staging";<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span><a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>  public static final String SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT =<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      "hbase.snapshot.restore.take.failsafe.snapshot";<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>  public static final boolean DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT = true;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>  public static final String SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      "hbase.snapshot.restore.failsafe.name";<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  public static final String DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      "hbase-failsafe-{snapshot.name}-{restore.timestamp}";<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>  public static final String DEFAULT_LOSSY_COUNTING_ERROR_RATE =<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      "hbase.util.default.lossycounting.errorrate";<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>  public static final String NOT_IMPLEMENTED = "Not implemented";<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>  private HConstants() {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    // Can't be instantiated with this ctor.<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>}<a name="line.1380"></a>
+<span class="sourceLineNo">1328</span>  // TODO: Move these defines to Canary Class<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public static final String HBASE_CANARY_WRITE_DATA_TTL_KEY = "hbase.canary.write.data.ttl";<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY =<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      "hbase.canary.write.perserver.regions.lowerLimit";<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span><a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY =<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      "hbase.canary.write.perserver.regions.upperLimit";<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span><a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>  public static final String HBASE_CANARY_WRITE_VALUE_SIZE_KEY = "hbase.canary.write.value.size";<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  public static final String HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY =<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      "hbase.canary.write.table.check.period";<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>  public static final String HBASE_CANARY_READ_RAW_SCAN_KEY = "hbase.canary.read.raw.enabled";<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span><a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  /**<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>   * Configuration keys for programmatic JAAS configuration for secured ZK interaction<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>   */<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>  public static final String ZK_CLIENT_KEYTAB_FILE = "hbase.zookeeper.client.keytab.file";<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  public static final String ZK_CLIENT_KERBEROS_PRINCIPAL =<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      "hbase.zookeeper.client.kerberos.principal";<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  public static final String ZK_SERVER_KEYTAB_FILE = "hbase.zookeeper.server.keytab.file";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  public static final String ZK_SERVER_KERBEROS_PRINCIPAL =<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      "hbase.zookeeper.server.kerberos.principal";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  /** Config key for hbase temporary directory in hdfs */<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  public static final String TEMPORARY_FS_DIRECTORY_KEY = "hbase.fs.tmp.dir";<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span><a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>  /**<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * Don't use it! This'll get you the wrong path in a secure cluster.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * Use FileSystem.getHomeDirectory() or<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   */<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  public static final String DEFAULT_TEMPORARY_HDFS_DIRECTORY = "/user/"<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      + System.getProperty("user.name") + "/hbase-staging";<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>  public static final String SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT =<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      "hbase.snapshot.restore.take.failsafe.snapshot";<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>  public static final boolean DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT = true;<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span><a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>  public static final String SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      "hbase.snapshot.restore.failsafe.name";<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  public static final String DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>      "hbase-failsafe-{snapshot.name}-{restore.timestamp}";<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span><a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>  public static final String DEFAULT_LOSSY_COUNTING_ERROR_RATE =<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      "hbase.util.default.lossycounting.errorrate";<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>  public static final String NOT_IMPLEMENTED = "Not implemented";<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>  private HConstants() {<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    // Can't be instantiated with this ctor.<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>}<a name="line.1381"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 1578f50..00f72be 100644
--- a/book.html
+++ b/book.html
@@ -26965,35 +26965,49 @@ Others, such as <code>hbase shell</code> (<a href="#shell">The Apache HBase Shel
 <div class="sect2">
 <h3 id="_canary"><a class="anchor" href="#_canary"></a>149.1. Canary</h3>
 <div class="paragraph">
-<p>There is a Canary class can help users to canary-test the HBase cluster status, with every column-family for every regions or RegionServer&#8217;s granularity.
-To see the usage, use the <code>-help</code> parameter.</p>
-</div>
-<div class="listingblock">
-<div class="content">
-<pre>$ ${HBASE_HOME}/bin/hbase canary -help
-
-Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]
- where [opts] are:
-   -help          Show this help and exit.
-   -regionserver  replace the table argument to regionserver,
-      which means to enable regionserver mode
-   -allRegions    Tries all regions on a regionserver,
-      only works in regionserver mode.
-   -zookeeper    Tries to grab zookeeper.znode.parent
-      on each zookeeper instance
-   -daemon        Continuous check at defined intervals.
-   -interval &lt;N&gt;  Interval between checks (sec)
-   -e             Use table/regionserver as regular expression
-      which means the table/regionserver is regular expression pattern
-   -f &lt;B&gt;         stop whole program if first error occurs, default is true
-   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)
-   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)
-   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)
-   -writeSniffing enable the write sniffing in canary
-   -treatFailureAsError treats read / write failure as error
-   -writeTable    The table used for write sniffing. Default is hbase:canary
-   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test Default is false and raw is not enabled during scan
-   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params</pre>
+<p>The Canary tool can help users "canary-test" the HBase cluster status.
+The default "region mode" fetches a row from every column-family of every regions.
+In "regionserver mode", the Canary tool will fetch a row from a random
+region on each of the cluster&#8217;s RegionServers. In "zookeeper mode", the
+Canary will read the root znode on each member of the zookeeper ensemble.</p>
+</div>
+<div class="paragraph">
+<p>To see usage, pass the <code>-help</code> parameter (if you pass no
+parameters, the Canary tool starts executing in the default
+region "mode" fetching a row from every region in the cluster).</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>2018-10-16 13:11:27,037 INFO  [main] tool.Canary: Execution thread count=16
+Usage: canary [OPTIONS] [&lt;TABLE1&gt; [&lt;TABLE2]...] | [&lt;REGIONSERVER1&gt; [&lt;REGIONSERVER2]..]
+Where [OPTIONS] are:
+ -h,-help        show this help and exit.
+ -regionserver   set 'regionserver mode'; gets row from random region on server
+ -allRegions     get from ALL regions when 'regionserver mode', not just random one.
+ -zookeeper      set 'zookeeper mode'; grab zookeeper.znode.parent on each ensemble member
+ -daemon         continuous check at defined intervals.
+ -interval &lt;N&gt;   interval between checks in seconds
+ -e              consider table/regionserver argument as regular expression
+ -f &lt;B&gt;          exit on first error; default=true
+ -failureAsError treat read/write failure as error
+ -t &lt;N&gt;          timeout for canary-test run; default=600000ms
+ -writeSniffing  enable write sniffing
+ -writeTable     the table used for write sniffing; default=hbase:canary
+ -writeTableTimeout &lt;N&gt;  timeout for writeTable; default=600000ms
+ -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;,...
+                comma-separated list of table read timeouts (no spaces);
+                logs 'ERROR' if takes longer. default=600000ms
+ -permittedZookeeperFailures &lt;N&gt;  Ignore first N failures attempting to
+                connect to individual zookeeper nodes in ensemble
+
+ -D&lt;configProperty&gt;=&lt;value&gt; to assign or override configuration params
+ -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Set to enable/disable raw scan; default=false
+
+Canary runs in one of three modes: region (default), regionserver, or zookeeper.
+To sniff/probe all regions, pass no arguments.
+To sniff/probe all regions of a table, pass tablename.
+To sniff/probe regionservers, pass -regionserver, etc.
+See http://hbase.apache.org/book.html#_canary for Canary documentation.</pre>
 </div>
 </div>
 <div class="admonitionblock note">
@@ -27003,18 +27017,14 @@ Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]
 <i class="fa icon-note" title="Note"></i>
 </td>
 <td class="content">
-The <code>Sink</code> class is instantiated using the <code>hbase.canary.sink.class</code> configuration property which
-will also determine the used Monitor class. In the absence of this property RegionServerStdOutSink
-will be used. You need to use the Sink according to the passed parameters to the <em>canary</em> command.
-As an example you have to set <code>hbase.canary.sink.class</code> property to
-<code>org.apache.hadoop.hbase.tool.Canary$RegionStdOutSink</code> for using table parameters.
+The <code>Sink</code> class is instantiated using the <code>hbase.canary.sink.class</code> configuration property.
 </td>
 </tr>
 </table>
 </div>
 <div class="paragraph">
-<p>This tool will return non zero error codes to user for collaborating with other monitoring tools, such as Nagios.
-The error code definitions are:</p>
+<p>This tool will return non zero error codes to user for collaborating with other monitoring tools,
+such as Nagios.  The error code definitions are:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27026,9 +27036,9 @@ The error code definitions are:</p>
 </div>
 </div>
 <div class="paragraph">
-<p>Here are some examples based on the following given case.
-There are two Table objects called test-01 and test-02, they have two column family cf1 and cf2 respectively, and deployed on the 3 RegionServers.
-see following table.</p>
+<p>Here are some examples based on the following given case: given two Table objects called test-01
+and test-02 each with two column family cf1 and cf2 respectively, deployed on 3 RegionServers.
+See the following table.</p>
 </div>
 <table class="tableblock frame-all grid-all spread">
 <colgroup>
@@ -27062,7 +27072,7 @@ see following table.</p>
 </tbody>
 </table>
 <div class="paragraph">
-<p>Following are some examples based on the previous given case.</p>
+<p>Following are some example outputs based on the previous given case.</p>
 </div>
 <div class="sect3">
 <h4 id="_canary_test_for_every_column_family_store_of_every_region_of_every_table"><a class="anchor" href="#_canary_test_for_every_column_family_store_of_every_region_of_every_table"></a>149.1.1. Canary test for every column family (store) of every region of every table</h4>
@@ -27082,14 +27092,15 @@ see following table.</p>
 </div>
 </div>
 <div class="paragraph">
-<p>So you can see, table test-01 has two regions and two column families, so the Canary tool will pick 4 small piece of data from 4 (2 region * 2 store) different stores.
-This is a default behavior of the this tool does.</p>
+<p>So you can see, table test-01 has two regions and two column families, so the Canary tool in the
+default "region mode" will pick 4 small piece of data from 4 (2 region * 2 store) different stores.
+This is a default behavior.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_canary_test_for_every_column_family_store_of_every_region_of_specific_table_s"><a class="anchor" href="#_canary_test_for_every_column_family_store_of_every_region_of_specific_table_s"></a>149.1.2. Canary test for every column family (store) of every region of specific table(s)</h4>
+<h4 id="_canary_test_for_every_column_family_store_of_every_region_of_a_specific_table_s"><a class="anchor" href="#_canary_test_for_every_column_family_store_of_every_region_of_a_specific_table_s"></a>149.1.2. Canary test for every column family (store) of every region of a specific table(s)</h4>
 <div class="paragraph">
-<p>You can also test one or more specific tables.</p>
+<p>You can also test one or more specific tables by passing table names.</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27100,7 +27111,9 @@ This is a default behavior of the this tool does.</p>
 <div class="sect3">
 <h4 id="_canary_test_with_regionserver_granularity"><a class="anchor" href="#_canary_test_with_regionserver_granularity"></a>149.1.3. Canary test with RegionServer granularity</h4>
 <div class="paragraph">
-<p>This will pick one small piece of data from each RegionServer, and can also put your RegionServer name as input options for canary-test specific RegionServer.</p>
+<p>In "regionserver mode", the Canary tool will pick one small piece of data
+from each RegionServer (You can also pass one or more RegionServer names as arguments
+to the canary-test when in "regionserver mode").</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27115,7 +27128,8 @@ This is a default behavior of the this tool does.</p>
 <div class="sect3">
 <h4 id="_canary_test_with_regular_expression_pattern"><a class="anchor" href="#_canary_test_with_regular_expression_pattern"></a>149.1.4. Canary test with regular expression pattern</h4>
 <div class="paragraph">
-<p>This will test both table test-01 and test-02.</p>
+<p>You can pass regexes for table names when in "region mode" or for servernames when
+in "regionserver mode". The below will test both table test-01 and test-02.</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27124,10 +27138,12 @@ This is a default behavior of the this tool does.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_run_canary_test_as_daemon_mode"><a class="anchor" href="#_run_canary_test_as_daemon_mode"></a>149.1.5. Run canary test as daemon mode</h4>
+<h4 id="_run_canary_test_as_a_daemon"><a class="anchor" href="#_run_canary_test_as_a_daemon"></a>149.1.5. Run canary test as a "daemon"</h4>
 <div class="paragraph">
-<p>Run repeatedly with interval defined in option <code>-interval</code> whose default value is 60 seconds.
-This daemon will stop itself and return non-zero error code if any error occurs, due to the default value of option -f is true.</p>
+<p>Run repeatedly with an interval defined via the option <code>-interval</code> (default value is 60 seconds).
+This daemon will stop itself and return non-zero error code if any error occur. To have
+the daemon keep running across errors, pass the -f flag with its value set to false
+(see usage above).</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27135,7 +27151,7 @@ This daemon will stop itself and return non-zero error code if any error occurs,
 </div>
 </div>
 <div class="paragraph">
-<p>Run repeatedly with 5 second intervals and will not stop itself even if errors occur in the test.</p>
+<p>To run repeatedly with 5 second intervals and not stop on errors, do the following.</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27146,9 +27162,11 @@ This daemon will stop itself and return non-zero error code if any error occurs,
 <div class="sect3">
 <h4 id="_force_timeout_if_canary_test_stuck"><a class="anchor" href="#_force_timeout_if_canary_test_stuck"></a>149.1.6. Force timeout if canary test stuck</h4>
 <div class="paragraph">
-<p>In some cases the request is stuck and no response is sent back to the client. This can happen with dead RegionServers which the master has not yet noticed.
-Because of this we provide a timeout option to kill the canary test and return a non-zero error code.
-This run sets the timeout value to 60 seconds, the default value is 600 seconds.</p>
+<p>In some cases the request is stuck and no response is sent back to the client. This
+can happen with dead RegionServers which the master has not yet noticed.
+Because of this we provide a timeout option to kill the canary test and return a
+non-zero error code. The below sets the timeout value to 60 seconds (the default value
+is 600 seconds).</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27159,11 +27177,12 @@ This run sets the timeout value to 60 seconds, the default value is 600 seconds.
 <div class="sect3">
 <h4 id="_enable_write_sniffing_in_canary"><a class="anchor" href="#_enable_write_sniffing_in_canary"></a>149.1.7. Enable write sniffing in canary</h4>
 <div class="paragraph">
-<p>By default, the canary tool only check the read operations, it&#8217;s hard to find the problem in the
-write path. To enable the write sniffing, you can run canary with the <code>-writeSniffing</code> option.
-When the write sniffing is enabled, the canary tool will create an hbase table and make sure the
-regions of the table distributed on all region servers. In each sniffing period, the canary will
-try to put data to these regions to check the write availability of each region server.</p>
+<p>By default, the canary tool only checks read operations. To enable the write sniffing,
+you can run the canary with the <code>-writeSniffing</code> option set.  When write sniffing is
+enabled, the canary tool will create an hbase table and make sure the
+regions of the table are distributed to all region servers. In each sniffing period,
+the canary will try to put data to these regions to check the write availability of
+each region server.</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27171,7 +27190,7 @@ try to put data to these regions to check the write availability of each region
 </div>
 </div>
 <div class="paragraph">
-<p>The default write table is <code>hbase:canary</code> and can be specified by the option <code>-writeTable</code>.</p>
+<p>The default write table is <code>hbase:canary</code> and can be specified with the option <code>-writeTable</code>.</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27179,17 +27198,16 @@ try to put data to these regions to check the write availability of each region
 </div>
 </div>
 <div class="paragraph">
-<p>The default value size of each put is 10 bytes and you can set it by the config key:
+<p>The default value size of each put is 10 bytes. You can set it via the config key:
 <code>hbase.canary.write.value.size</code>.</p>
 </div>
 </div>
 <div class="sect3">
 <h4 id="_treat_read_write_failure_as_error"><a class="anchor" href="#_treat_read_write_failure_as_error"></a>149.1.8. Treat read / write failure as error</h4>
 <div class="paragraph">
-<p>By default, the canary tool only logs read failure, due to e.g. RetriesExhaustedException,
-while returning normal exit code. To treat read / write failure as error, you can run canary
-with the <code>-treatFailureAsError</code> option. When enabled, read / write failure would result in error
-exit code.</p>
+<p>By default, the canary tool only logs read failures&#8201;&#8212;&#8201;due to e.g. RetriesExhaustedException, etc.&#8201;&#8212;&#8201;and will return the 'normal' exit code. To treat read/write failure as errors, you can run canary
+with the <code>-treatFailureAsError</code> option. When enabled, read/write failures will result in an
+error exit code.</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -27200,7 +27218,7 @@ exit code.</p>
 <div class="sect3">
 <h4 id="_running_canary_in_a_kerberos_enabled_cluster"><a class="anchor" href="#_running_canary_in_a_kerberos_enabled_cluster"></a>149.1.9. Running Canary in a Kerberos-enabled Cluster</h4>
 <div class="paragraph">
-<p>To run Canary in a Kerberos-enabled cluster, configure the following two properties in <em>hbase-site.xml</em>:</p>
+<p>To run the Canary in a Kerberos-enabled cluster, configure the following two properties in <em>hbase-site.xml</em>:</p>
 </div>
 <div class="ulist">
 <ul>
@@ -41284,7 +41302,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-10-16 14:34:08 UTC
+Last updated 2018-10-17 14:33:27 UTC
 </div>
 </div>
 </body>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index d5051d3..0d37a25 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="20181016" />
+    <meta name="Date-Revision-yyyymmdd" content="20181017" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -294,7 +294,7 @@
 <td>3790</td>
 <td>0</td>
 <td>0</td>
-<td>15146</td></tr></table></div>
+<td>15114</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -8762,7 +8762,7 @@
 <td><a href="#org.apache.hadoop.hbase.tool.Canary.java">org/apache/hadoop/hbase/tool/Canary.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>51</td></tr>
+<td>20</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.java">org/apache/hadoop/hbase/tool/LoadIncrementalHFiles.java</a></td>
 <td>0</td>
@@ -8777,7 +8777,7 @@
 <td><a href="#org.apache.hadoop.hbase.tool.TestCanaryTool.java">org/apache/hadoop/hbase/tool/TestCanaryTool.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>6</td></tr>
+<td>5</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.tool.TestLoadIncrementalHFiles.java">org/apache/hadoop/hbase/tool/TestLoadIncrementalHFiles.java</a></td>
 <td>0</td>
@@ -9806,7 +9806,7 @@
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>groups: <tt>&quot;*,org.apache.hbase.thirdparty,org.apache.hadoop.hbase.shaded&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>1144</td>
+<td>1145</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -9859,7 +9859,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>1484</td>
+<td>1452</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -9869,7 +9869,7 @@
 <tr class="a">
 <td>whitespace</td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_whitespace.html#FileTabCharacter">FileTabCharacter</a></td>
-<td>9</td>
+<td>8</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -49860,25 +49860,25 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>703</td></tr>
+<td>704</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>705</td></tr>
+<td>706</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>793</td></tr>
+<td>794</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>807</td></tr></table></div>
+<td>808</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.TestHFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.java</h3>
 <table border="0" class="table table-striped">
@@ -77913,235 +77913,235 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>388</td></tr>
+<td>389</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>511</td></tr>
+<td>512</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>523</td></tr>
+<td>524</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>547</td></tr>
+<td>548</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
-<td>562</td></tr>
+<td>563</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>586</td></tr>
+<td>587</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>588</td></tr>
+<td>589</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>622</td></tr>
+<td>623</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>637</td></tr>
+<td>638</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>643</td></tr>
+<td>644</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>644</td></tr>
+<td>645</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>645</td></tr>
+<td>646</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>840</td></tr>
+<td>841</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>841</td></tr>
+<td>842</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>842</td></tr>
+<td>843</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>845</td></tr>
+<td>846</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>853</td></tr>
+<td>854</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>965</td></tr>
+<td>966</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>971</td></tr>
+<td>972</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>999</td></tr>
+<td>1000</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1000</td></tr>
+<td>1001</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1001</td></tr>
+<td>1002</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1053</td></tr>
+<td>1054</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1054</td></tr>
+<td>1055</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1056</td></tr>
+<td>1057</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1079</td></tr>
+<td>1080</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1148</td></tr>
+<td>1149</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1149</td></tr>
+<td>1150</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1181</td></tr>
+<td>1182</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1376</td></tr>
+<td>1377</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>1444</td></tr>
+<td>1445</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>1483</td></tr>
+<td>1484</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1587</td></tr>
+<td>1588</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1851</td></tr>
+<td>1852</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2063</td></tr>
+<td>2064</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2256</td></tr>
+<td>2257</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2370</td></tr>
+<td>2371</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2402</td></tr>
+<td>2403</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>2687</td></tr></table></div>
+<td>2688</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</h3>
 <table border="0" class="table table-striped">
@@ -86646,13 +86646,13 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>233</td></tr>
+<td>235</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 115).</td>
-<td>382</td></tr></table></div>
+<td>384</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.compactions.CurrentHourProvider.java">org/apache/hadoop/hbase/regionserver/compactions/CurrentHourProvider.java</h3>
 <table border="0" class="table table-striped">
@@ -106035,356 +106035,170 @@
 <th>Line</th></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 127).</td>
-<td>214</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 122).</td>
-<td>217</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 121).</td>
-<td>223</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 126).</td>
-<td>230</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 123).</td>
-<td>233</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 122).</td>
-<td>239</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>316</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
+<td>94</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>330</td></tr>
+<td>348</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>331</td></tr>
+<td>349</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>332</td></tr>
+<td>350</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>333</td></tr>
+<td>351</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>334</td></tr>
+<td>352</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>335</td></tr>
+<td>353</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>466</td></tr>
+<td>472</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 159 lines (max allowed is 150).</td>
-<td>618</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 127).</td>
-<td>714</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 117).</td>
-<td>721</td></tr>
+<td>Method length is 161 lines (max allowed is 150).</td>
+<td>643</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
-<td>728</td></tr>
+<td>755</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 103).</td>
-<td>771</td></tr>
+<td>798</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>836</td></tr>
+<td>863</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 108).</td>
-<td>868</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 124).</td>
-<td>877</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 109).</td>
-<td>878</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>879</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 140).</td>
-<td>884</td></tr>
+<td>1007</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>957</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>967</td></tr>
-<tr class="b">
+<td>1017</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>972</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 121).</td>
 <td>1022</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>1024</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 126).</td>
-<td>1057</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>1058</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 122).</td>
-<td>1059</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>1085</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>1105</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 143).</td>
-<td>1114</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>1116</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>1118</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>FileTabCharacter</td>
-<td>File contains tab characters (this is the first instance).</td>
-<td>1126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>1177</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 106).</td>
-<td>1185</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 117).</td>
-<td>1186</td></tr>
+<td>1181</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1252</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>1255</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 118).</td>
-<td>1299</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>1317</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 105).</td>
-<td>1318</td></tr>
+<td>1319</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>1333</td></tr>
+<td>1382</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 105).</td>
-<td>1385</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1428</td></tr>
-<tr class="a">
+<td>1476</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
-<td>1446</td></tr></table></div>
+<td>1494</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.LoadIncrementalHFiles.java">org/apache/hadoop/hbase/tool/LoadIncrementalHFiles.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<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.lang.String.format' import.</td>
 <td>49</td></tr>
-<tr class="b">
+<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.util.Bytes' import.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>618</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 10, 12.</td>
 <td>620</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 10, 12.</td>
 <td>622</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>623</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -106393,13 +106207,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.MapreduceTestingShim.java">org/apache/hadoop/hbase/tool/MapreduceTestingShim.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -106408,48 +106222,42 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.TestCanaryTool.java">org/apache/hadoop/hbase/tool/TestCanaryTool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<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.*.</td>
 <td>34</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>99</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 122).</td>
-<td>147</td></tr>
+<td>Line is longer than 100 characters (found 118).</td>
+<td>100</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
-<td>151</td></tr>
+<td>153</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 121).</td>
-<td>152</td></tr>
+<td>154</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
-<td>158</td></tr></table></div>
+<td>160</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.tool.TestLoadIncrementalHFiles.java">org/apache/hadoop/hbase/tool/TestLoadIncrementalHFiles.java</h3>
 <table border="0" class="table table-striped">
@@ -117709,7 +117517,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-17</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index a48c9b2..a182fa1 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3790,
-             Errors: 15146,
+             Errors: 15114,
              Warnings: 0,
              Infos: 0
       </title>
@@ -16477,7 +16477,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  51
+                  20
                 </td>
               </tr>
                           <tr>
@@ -25941,7 +25941,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  6
+                  5
                 </td>
               </tr>
                           <tr>

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 9374878..df10f46 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,7 +3824,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Tue Oct 16 14:45:42 UTC 2018"</code></td>
+<td class="colLast"><code>"Wed Oct 17 14:44:35 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3838,7 +3838,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"461477f21f10a475e76871b5c40f2a48"</code></td>
+<td class="colLast"><code>"021f466e549ff8f55d92edf9e3d7ac87"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">


[12/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class="sourceLineNo"

<TRUNCATED>

[31/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 7b435d2..4b549da 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -127,8 +127,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-use.html b/devapidocs/org/apache/hadoop/hbase/package-use.html
index e4fcea4..e9c04ef 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-use.html
@@ -3619,24 +3619,16 @@ service.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/HTableDescriptor.html#org.apache.hadoop.hbase.tool">HTableDescriptor</a>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
-             Use <a href="../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client"><code>TableDescriptorBuilder</code></a> to build <a href="../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase"><code>HTableDescriptor</code></a>.</span></div>
-</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/ServerName.html#org.apache.hadoop.hbase.tool">ServerName</a>
 <div class="block">Name of a particular incarnation of an HBase Server.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TableName.html#org.apache.hadoop.hbase.tool">TableName</a>
 <div class="block">Immutable POJO class for representing a table name.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TableNotFoundException.html#org.apache.hadoop.hbase.tool">TableNotFoundException</a>
 <div class="block">Thrown when a table can not be located</div>
 </td>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 8f7d034..c97436d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2272">HStore.StoreFlusherImpl</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2273">HStore.StoreFlusherImpl</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></pre>
 </li>
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tracker</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2274">tracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2275">tracker</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSeqNum">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSeqNum</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2275">cacheFlushSeqNum</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2276">cacheFlushSeqNum</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2276">snapshot</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2277">snapshot</a></pre>
 </li>
 </ul>
 <a name="tempFiles">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tempFiles</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2277">tempFiles</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2278">tempFiles</a></pre>
 </li>
 </ul>
 <a name="committedFiles">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>committedFiles</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2278">committedFiles</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2279">committedFiles</a></pre>
 </li>
 </ul>
 <a name="cacheFlushCount">
@@ -324,7 +324,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2279">cacheFlushCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2280">cacheFlushCount</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSize">
@@ -333,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2280">cacheFlushSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2281">cacheFlushSize</a></pre>
 </li>
 </ul>
 <a name="outputFileSize">
@@ -342,7 +342,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>outputFileSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2281">outputFileSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2282">outputFileSize</a></pre>
 </li>
 </ul>
 </li>
@@ -359,7 +359,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StoreFlusherImpl</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2283">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2284">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
 </ul>
@@ -377,7 +377,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2293">prepare</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2294">prepare</a>()</pre>
 <div class="block">This is not thread safe. The caller should have a lock on the region or the store.
  If necessary, the lock can be added with the patch provided in HBASE-10087</div>
 <dl>
@@ -394,7 +394,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCache</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2303">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2304">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#flushCache-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Flush the cache (create the new store file)
@@ -415,7 +415,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>commit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2312">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2313">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#commit-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Commit the flush - add the store file to the store and clear the
@@ -440,7 +440,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2355">getOutputFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2356">getOutputFileSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getOutputFileSize--">getOutputFileSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></code></dd>
@@ -455,7 +455,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getCommittedFiles</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2360">getCommittedFiles</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2361">getCommittedFiles</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getCommittedFiles--">StoreFlushContext</a></code></span></div>
 <div class="block">Returns the newly committed files from the flush. Called only if commit returns true</div>
 <dl>
@@ -472,7 +472,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>replayFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2373">replayFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;fileNames,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2374">replayFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;fileNames,
                         boolean&nbsp;dropMemstoreSnapshot)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Similar to commit, but called in secondary region replicas for replaying the
@@ -495,7 +495,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2405">abort</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2406">abort</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Abort the snapshot preparation. Drops the snapshot if any.</div>
 <dl>


[28/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
index d14100f..7df1ac2 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
@@ -122,8 +122,9 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1378">Canary.RegionServerMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1429">Canary.RegionServerMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
+<div class="block">A monitor for regionserver mode</div>
 </li>
 </ul>
 </div>
@@ -168,10 +169,10 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                    boolean&nbsp;useRegExp,
-                   <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                   <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                    boolean&nbsp;allRegions,
                    boolean&nbsp;treatFailureAsError,
@@ -256,7 +257,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>allRegions</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1380">allRegions</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1430">allRegions</a></pre>
 </li>
 </ul>
 </li>
@@ -267,16 +268,16 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-boolean-long-">
+<a name="RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-boolean-long-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionServerMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1382">RegionServerMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1432">RegionServerMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                            boolean&nbsp;useRegExp,
-                           <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                           <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                            boolean&nbsp;allRegions,
                            boolean&nbsp;treatFailureAsError,
@@ -297,7 +298,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1389">getSink</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1440">getSink</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -306,7 +307,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1397">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1448">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -321,7 +322,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoTableNames</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1413">checkNoTableNames</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1464">checkNoTableNames</a>()</pre>
 </li>
 </ul>
 <a name="monitorRegionServers-java.util.Map-org.apache.hadoop.hbase.tool.Canary.RegionServerStdOutSink-">
@@ -330,7 +331,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>monitorRegionServers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1446">monitorRegionServers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;rsAndRMap,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1494">monitorRegionServers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;rsAndRMap,
                                   <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a>&nbsp;regionServerSink)</pre>
 </li>
 </ul>
@@ -340,7 +341,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRegionServerByName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1496">filterRegionServerByName</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1544">filterRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="getAllRegionServerByName--">
@@ -349,7 +350,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllRegionServerByName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1502">getAllRegionServerByName</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1550">getAllRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="doFilterRegionServerByName-java.util.Map-">
@@ -358,7 +359,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doFilterRegionServerByName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1557">doFilterRegionServerByName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang"
 >String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;fullRsAndRMap)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1589">doFilterRegionServerByName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang"
 >String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;fullRsAndRMap)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
index 9ace910..f7faa53 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
@@ -122,8 +122,9 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.181">Canary.RegionServerStdOutSink</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.191">Canary.RegionServerStdOutSink</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></pre>
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
 </li>
 </ul>
 </div>
@@ -205,7 +206,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionServerStdOutSink</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.181">RegionServerStdOutSink</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.191">RegionServerStdOutSink</a>()</pre>
 </li>
 </ul>
 </li>
@@ -222,7 +223,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.183">publishReadFailure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.192">publishReadFailure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server)</pre>
 </li>
 </ul>
@@ -232,7 +233,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.188">publishReadTiming</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html#line.197">publishReadTiming</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;server,
                               long&nbsp;msTime)</pre>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
index ce74e0c..5950908 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
@@ -117,10 +117,11 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.475">Canary.RegionServerTask</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.482">Canary.RegionServerTask</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
-<div class="block">Get one row from a region on the regionserver and outputs the latency, or the failure.</div>
+<div class="block">Run a single RegionServer Task and then exit.
+ Get one row from a region on the regionserver and output latency or the failure.</div>
 </li>
 </ul>
 </div>
@@ -227,7 +228,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.476">connection</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.483">connection</a></pre>
 </li>
 </ul>
 <a name="serverName">
@@ -236,7 +237,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>serverName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.477">serverName</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.484">serverName</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -245,7 +246,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.478">region</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.485">region</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -254,7 +255,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.479">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.486">sink</a></pre>
 </li>
 </ul>
 <a name="successes">
@@ -263,7 +264,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>successes</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.480">successes</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.487">successes</a></pre>
 </li>
 </ul>
 </li>
@@ -280,7 +281,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionServerTask</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.482">RegionServerTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.489">RegionServerTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName,
                  <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                  <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a>&nbsp;sink,
@@ -301,7 +302,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.492">call</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html#line.499">call</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true#call--" title="class or interface in java.util.concurrent">call</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
index 3ea1365..2bc479f 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
@@ -122,8 +122,9 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.207">Canary.RegionStdOutSink</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.219">Canary.RegionStdOutSink</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></pre>
+<div class="block">By Region, for 'region'  mode.</div>
 </li>
 </ul>
 </div>
@@ -273,7 +274,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>perTableReadLatency</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.209">perTableReadLatency</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.220">perTableReadLatency</a></pre>
 </li>
 </ul>
 <a name="writeLatency">
@@ -282,7 +283,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writeLatency</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.210">writeLatency</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.221">writeLatency</a></pre>
 </li>
 </ul>
 </li>
@@ -299,7 +300,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionStdOutSink</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.207">RegionStdOutSink</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.219">RegionStdOutSink</a>()</pre>
 </li>
 </ul>
 </li>
@@ -316,7 +317,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.212">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.223">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
@@ -327,7 +328,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.217">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.228">publishReadFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;column,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
@@ -339,7 +340,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishReadTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.223">publishReadTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.235">publishReadTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                               <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                               <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;column,
                               long&nbsp;msTime)</pre>
@@ -351,7 +352,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.228">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.241">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                 <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
@@ -362,7 +363,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.233">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.246">publishWriteFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                 <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                 <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;column,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
@@ -374,7 +375,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>publishWriteTiming</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.239">publishWriteTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.253">publishWriteTiming</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;column,
                                long&nbsp;msTime)</pre>
@@ -386,7 +387,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadLatencyMap</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.244">getReadLatencyMap</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.259">getReadLatencyMap</a>()</pre>
 </li>
 </ul>
 <a name="initializeAndGetReadLatencyForTable-java.lang.String-">
@@ -395,7 +396,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeAndGetReadLatencyForTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.248">initializeAndGetReadLatencyForTable</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.263">initializeAndGetReadLatencyForTable</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="initializeWriteLatency--">
@@ -404,7 +405,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeWriteLatency</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.254">initializeWriteLatency</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.269">initializeWriteLatency</a>()</pre>
 </li>
 </ul>
 <a name="getWriteLatency--">
@@ -413,7 +414,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getWriteLatency</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.258">getWriteLatency</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#line.273">getWriteLatency</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
index dd54d78..b843fce 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.305">Canary.RegionTask.TaskType</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.323">Canary.RegionTask.TaskType</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&gt;</pre>
 </li>
 </ul>
@@ -210,7 +210,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>READ</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.306">READ</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.324">READ</a></pre>
 </li>
 </ul>
 <a name="WRITE">
@@ -219,7 +219,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WRITE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.306">WRITE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.324">WRITE</a></pre>
 </li>
 </ul>
 </li>
@@ -236,7 +236,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.207">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.219">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -256,7 +256,7 @@ for (Canary.RegionTask.TaskType c : Canary.RegionTask.TaskType.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.207">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html#line.219">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
index 2c8d990..7fbe840 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
@@ -117,11 +117,11 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.304">Canary.RegionTask</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.322">Canary.RegionTask</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
-<div class="block">For each column family of the region tries to get one row and outputs the latency, or the
- failure.</div>
+<div class="block">Run a single Region Task and then exit. For each column family of the Region, get one row and
+ output latency or failure.</div>
 </li>
 </ul>
 </div>
@@ -267,7 +267,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.308">connection</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.326">connection</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -276,7 +276,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.309">region</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.327">region</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -285,7 +285,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.310">sink</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.328">sink</a></pre>
 </li>
 </ul>
 <a name="taskType">
@@ -294,7 +294,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>taskType</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.311">taskType</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.329">taskType</a></pre>
 </li>
 </ul>
 <a name="rawScanEnabled">
@@ -303,7 +303,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>rawScanEnabled</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.312">rawScanEnabled</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.330">rawScanEnabled</a></pre>
 </li>
 </ul>
 <a name="serverName">
@@ -312,7 +312,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>serverName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.313">serverName</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.331">serverName</a></pre>
 </li>
 </ul>
 <a name="readWriteLatency">
@@ -321,7 +321,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>readWriteLatency</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.314">readWriteLatency</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.332">readWriteLatency</a></pre>
 </li>
 </ul>
 </li>
@@ -338,7 +338,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionTask</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.316">RegionTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.334">RegionTask</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
            <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
            <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
            <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a>&nbsp;sink,
@@ -361,7 +361,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.328">call</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.346">call</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true#call--" title="class or interface in java.util.concurrent">call</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
@@ -374,7 +374,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>read</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.339">read</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.357">read</a>()</pre>
 </li>
 </ul>
 <a name="write--">
@@ -383,11 +383,8 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>write</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.430">write</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html#line.438">write</a>()</pre>
 <div class="block">Check writes for the canary table</div>
-<dl>
-<dt><span class="returnLabel">Returns:</span></dt>
-</dl>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
index dbe5205..d0b9c67 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Sink.html
@@ -109,7 +109,8 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.120">Canary.Sink</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.127">Canary.Sink</a></pre>
+<div class="block">Sink interface used by the canary to output information</div>
 </li>
 </ul>
 </div>
@@ -183,7 +184,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadFailureCount</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.121">getReadFailureCount</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.128">getReadFailureCount</a>()</pre>
 </li>
 </ul>
 <a name="incReadFailureCount--">
@@ -192,7 +193,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>incReadFailureCount</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.122">incReadFailureCount</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.129">incReadFailureCount</a>()</pre>
 </li>
 </ul>
 <a name="getReadFailures--">
@@ -201,7 +202,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadFailures</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.123">getReadFailures</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.130">getReadFailures</a>()</pre>
 </li>
 </ul>
 <a name="updateReadFailures-java.lang.String-java.lang.String-">
@@ -210,7 +211,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>updateReadFailures</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.124">updateReadFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.131">updateReadFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 </li>
 </ul>
@@ -220,7 +221,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteFailureCount</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.125">getWriteFailureCount</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.132">getWriteFailureCount</a>()</pre>
 </li>
 </ul>
 <a name="incWriteFailureCount--">
@@ -229,7 +230,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>incWriteFailureCount</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.126">incWriteFailureCount</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.133">incWriteFailureCount</a>()</pre>
 </li>
 </ul>
 <a name="getWriteFailures--">
@@ -238,7 +239,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteFailures</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.127">getWriteFailures</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.134">getWriteFailures</a>()</pre>
 </li>
 </ul>
 <a name="updateWriteFailures-java.lang.String-java.lang.String-">
@@ -247,7 +248,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>updateWriteFailures</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.128">updateWriteFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html#line.135">updateWriteFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
index 25c0b7f..5bef6e1 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
@@ -121,9 +121,10 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.133">Canary.StdOutSink</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.141">Canary.StdOutSink</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></pre>
+<div class="block">Simple implementation of canary sink that allows plotting to a file or standard output.</div>
 </li>
 </ul>
 </div>
@@ -252,7 +253,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readFailureCount</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.134">readFailureCount</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.142">readFailureCount</a></pre>
 </li>
 </ul>
 <a name="writeFailureCount">
@@ -261,7 +262,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeFailureCount</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.135">writeFailureCount</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.143">writeFailureCount</a></pre>
 </li>
 </ul>
 <a name="readFailures">
@@ -270,7 +271,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readFailures</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.137">readFailures</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.144">readFailures</a></pre>
 </li>
 </ul>
 <a name="writeFailures">
@@ -279,7 +280,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writeFailures</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.138">writeFailures</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.145">writeFailures</a></pre>
 </li>
 </ul>
 </li>
@@ -296,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StdOutSink</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.133">StdOutSink</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.141">StdOutSink</a>()</pre>
 </li>
 </ul>
 </li>
@@ -313,7 +314,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadFailureCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.141">getReadFailureCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.148">getReadFailureCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailureCount--">getReadFailureCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
@@ -326,7 +327,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>incReadFailureCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.146">incReadFailureCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.153">incReadFailureCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#incReadFailureCount--">incReadFailureCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
@@ -339,7 +340,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadFailures</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.151">getReadFailures</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.158">getReadFailures</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getReadFailures--">getReadFailures</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
@@ -352,7 +353,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateReadFailures</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.156">updateReadFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.163">updateReadFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -366,7 +367,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteFailureCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.161">getWriteFailureCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.168">getWriteFailureCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailureCount--">getWriteFailureCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
@@ -379,7 +380,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>incWriteFailureCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.166">incWriteFailureCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.173">incWriteFailureCount</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#incWriteFailureCount--">incWriteFailureCount</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
@@ -392,7 +393,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteFailures</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.171">getWriteFailures</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.178">getWriteFailures</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html#getWriteFailures--">getWriteFailures</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></dd>
@@ -405,7 +406,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>updateWriteFailures</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.176">updateWriteFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html#line.183">updateWriteFailures</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;regionName,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>


[19/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    

<TRUNCATED>

[24/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
index 7becf50..5b9d987 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -332,2472 +332,2473 @@
 <span class="sourceLineNo">324</span>      confPrintThreshold = 10;<a name="line.324"></a>
 <span class="sourceLineNo">325</span>    }<a name="line.325"></a>
 <span class="sourceLineNo">326</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            "parallelPutCountPrintThreshold={}", getColumnFamilyName(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        this.memstore.getClass().getSimpleName(), policyName,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        this.verifyBulkLoads, this.parallelPutCountPrintThreshold);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  /**<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @return MemStore Instance to use in this store.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private MemStore getMemstore() {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    MemStore ms = null;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.getTableName().isSystemTable()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    } else {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    if (inMemoryCompaction == null) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      inMemoryCompaction =<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    switch (inMemoryCompaction) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      case NONE:<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            new Object[] { conf, this.comparator,<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        break;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      default:<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.360"></a>
-<span class="sourceLineNo">361</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return ms;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * Creates the cache config.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @param family The current column family.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   */<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>  /**<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * Creates the store engine configured for the given Store.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   *              being passed to coprocessors via the compactor.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @param conf Store configuration.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @return StoreEngine to use.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      CellComparator kvComparator) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    return StoreEngine.create(store, conf, comparator);<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>  /**<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param family<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @return TTL in seconds of the specified family<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   */<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    long ttl = family.getTimeToLive();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (ttl == HConstants.FOREVER) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      // Default is unlimited ttl.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      ttl = Long.MAX_VALUE;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    } else if (ttl == -1) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      ttl = Long.MAX_VALUE;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    } else {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      // Second -&gt; ms adjust for user data<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      ttl *= 1000;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    return ttl;<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>  @Override<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public String getColumnFamilyName() {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    return this.family.getNameAsString();<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>  @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  public TableName getTableName() {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return this.getRegionInfo().getTable();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public FileSystem getFileSystem() {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    return this.fs.getFileSystem();<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    return this.fs;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  /* Implementation of StoreConfigInformation */<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public long getStoreFileTtl() {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<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>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public long getMemStoreFlushSize() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    return this.region.memstoreFlushSize;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  @Override<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  public MemStoreSize getFlushableSize() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    return this.memstore.getFlushableSize();<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>  @Override<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public MemStoreSize getSnapshotSize() {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    return this.memstore.getSnapshotSize();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>  @Override<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public long getCompactionCheckMultiplier() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return this.compactionCheckMultiplier;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  public long getBlockingFileCount() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return blockingFileCount;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * @param conf The configuration<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.465"></a>
-<span class="sourceLineNo">466</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Returns the configured checksum algorithm.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * @param conf The configuration<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @return The checksum algorithm that is set in the configuration<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    if (checksumName == null) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      return ChecksumType.getDefaultChecksumType();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    } else {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      return ChecksumType.nameToType(checksumName);<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>   * @return how many bytes to write between status checks<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public static int getCloseCheckInterval() {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    return closeCheckInterval;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>  @Override<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    return this.family;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>  }<a name="line.493"></a>
-<span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  @Override<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  public OptionalLong getMaxSequenceId() {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>  @Override<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * @param hri {@link RegionInfo} for the region.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   * @return Path to family/Store home directory.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>   */<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  @Deprecated<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      final RegionInfo hri, final byte[] family) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<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>  /**<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * @param encodedName Encoded region name.<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   * @return Path to family/Store home directory.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  @Deprecated<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      final String encodedName, final byte[] family) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  }<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>   * @return the data block encoder<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   */<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return dataBlockEncoder;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>  /**<a name="line.536"></a>
-<span class="sourceLineNo">537</span>   * Should be used only in tests.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * @param blockEncoder the block delta encoder to use<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   */<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    this.dataBlockEncoder = blockEncoder;<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>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.545"></a>
-<span class="sourceLineNo">546</span>   * from the given directory.<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * @throws IOException<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   */<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return openStoreFiles(files);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      return Collections.emptyList();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // initialize the thread pool for opening store files in parallel..<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-"<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.562"></a>
-<span class="sourceLineNo">563</span><a name="line.563"></a>
-<span class="sourceLineNo">564</span>    int totalValidStoreFile = 0;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      // open each store file in parallel<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      totalValidStoreFile++;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    IOException ioe = null;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        try {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          HStoreFile storeFile = completionService.take().get();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          if (storeFile != null) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>            long length = storeFile.getReader().length();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            this.storeSize.addAndGet(length);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            this.totalUncompressedBytes<a name="line.580"></a>
-<span class="sourceLineNo">581</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            LOG.debug("loaded {}", storeFile);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            results.add(storeFile);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        } catch (InterruptedException e) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        } catch (ExecutionException e) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.588"></a>
-<span class="sourceLineNo">589</span>        }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    } finally {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    if (ioe != null) {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      // close StoreFile readers<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      boolean evictOnClose =<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      for (HStoreFile file : results) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        try {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          if (file != null) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>            file.closeStoreFile(evictOnClose);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          }<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        } catch (IOException e) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          LOG.warn("Could not close store file", e);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      throw ioe;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    return results;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>  @Override<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public void refreshStoreFiles() throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    refreshStoreFilesInternal(newFiles);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<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>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * region replicas to keep up to date with the primary region files.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * @throws IOException<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   */<a name="line.623"></a>
-<span class="sourceLineNo">624</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    for (String file : newFiles) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    }<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    refreshStoreFilesInternal(storeFiles);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  /**<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * been opened, and removes the store file readers for store files no longer<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * the primary region files.<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * @throws IOException<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   */<a name="line.638"></a>
-<span class="sourceLineNo">639</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    for (HStoreFile sf : currentFiles) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    for (HStoreFile sf : compactedFiles) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    // Exclude the files that have already been compacted<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (toBeAddedFiles.isEmpty() &amp;&amp; toBeRemovedFiles.isEmpty()) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      return;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    LOG.info("Refreshing store files for region " + this.getRegionInfo().getRegionNameAsString()<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      + " files to add: " + toBeAddedFiles + " files to remove: " + toBeRemovedFiles);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    Set&lt;HStoreFile&gt; toBeRemovedStoreFiles = new HashSet&lt;&gt;(toBeRemovedFiles.size());<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    for (StoreFileInfo sfi : toBeRemovedFiles) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      toBeRemovedStoreFiles.add(currentFilesSet.get(sfi));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    // try to open the files<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    List&lt;HStoreFile&gt; openedFiles = openStoreFiles(toBeAddedFiles);<a name="line.675"></a>
-<span class="sourceLineNo">676</span><a name="line.676"></a>
-<span class="sourceLineNo">677</span>    // propogate the file changes to the underlying store file manager<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); //won't throw an exception<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>    // Advance the memstore read point to be at least the new store files seqIds so that<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    // readers might pick it up. This assumes that the store is not getting any writes (otherwise<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // in-flight transactions might be made visible)<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    if (!toBeAddedFiles.isEmpty()) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      // we must have the max sequence id here as we do have several store files<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      region.getMVCC().advanceTo(this.getMaxSequenceId().getAsLong());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    completeCompaction(toBeRemovedStoreFiles);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @VisibleForTesting<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  protected HStoreFile createStoreFileAndReader(final Path p) throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    StoreFileInfo info = new StoreFileInfo(conf, this.getFileSystem(), p);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return createStoreFileAndReader(info);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  private HStoreFile createStoreFileAndReader(StoreFileInfo info) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    info.setRegionCoprocessorHost(this.region.getCoprocessorHost());<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    HStoreFile storeFile = new HStoreFile(this.getFileSystem(), info, this.conf, this.cacheConf,<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        this.family.getBloomFilterType(), isPrimaryReplicaStore());<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    storeFile.initReader();<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    return storeFile;<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  }<a name="line.703"></a>
-<span class="sourceLineNo">704</span><a name="line.704"></a>
-<span class="sourceLineNo">705</span>  /**<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * This message intends to inform the MemStore that next coming updates<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   * are going to be part of the replaying edits from WAL<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   */<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  public void startReplayingFromWAL(){<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    this.memstore.startReplayingFromWAL();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * are done<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  public void stopReplayingFromWAL(){<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    this.memstore.stopReplayingFromWAL();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  /**<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   * Adds a value to the memstore<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   */<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void add(final Cell cell, MemStoreSizing memstoreSizing) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    lock.readLock().lock();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    try {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.728"></a>
-<span class="sourceLineNo">729</span>          "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      }<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      this.memstore.add(cell, memstoreSizing);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    } finally {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      lock.readLock().unlock();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      currentParallelPutCount.decrementAndGet();<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    }<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>  /**<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * Adds the specified value to the memstore<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   */<a name="line.740"></a>
-<span class="sourceLineNo">741</span>  public void add(final Iterable&lt;Cell&gt; cells, MemStoreSizing memstoreSizing) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    lock.readLock().lock();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    try {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.745"></a>
-<span class="sourceLineNo">746</span>            "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      memstore.add(cells, memstoreSizing);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    } finally {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>      lock.readLock().unlock();<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      currentParallelPutCount.decrementAndGet();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Override<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public long timeOfOldestEdit() {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    return memstore.timeOfOldestEdit();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
-<span class="sourceLineNo">761</span>   * @return All store files.<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   */<a name="line.762"></a>
-<span class="sourceLineNo">763</span>  @Override<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  public Collection&lt;HStoreFile&gt; getStorefiles() {<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return this.storeEngine.getStoreFileManager().getStorefiles();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>  @Override<a name="line.768"></a>
-<span class="sourceLineNo">769</span>  public Collection&lt;HStoreFile&gt; getCompactedFiles() {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    return this.storeEngine.getStoreFileManager().getCompactedfiles();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>  /**<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   * This throws a WrongRegionException if the HFile does not fit in this region, or an<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * InvalidHFileException if the HFile is not valid.<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   */<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void assertBulkLoadHFileOk(Path srcPath) throws IOException {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    HFile.Reader reader  = null;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    try {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      LOG.info("Validating hfile at " + srcPath + " for inclusion in "<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          + "store " + this + " region " + this.getRegionInfo().getRegionNameAsString());<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      reader = HFile.createReader(srcPath.getFileSystem(conf), srcPath, cacheConf,<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        isPrimaryReplicaStore(), conf);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      reader.loadFileInfo();<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>      Optional&lt;byte[]&gt; firstKey = reader.getFirstRowKey();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      Preconditions.checkState(firstKey.isPresent(), "First key can not be null");<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      Optional&lt;Cell&gt; lk = reader.getLastKey();<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Preconditions.checkState(lk.isPresent(), "Last key can not be null");<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      byte[] lastKey =  CellUtil.cloneRow(lk.get());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      if (LOG.isDebugEnabled()) {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        LOG.debug("HFile bounds: first=" + Bytes.toStringBinary(firstKey.get()) +<a name="line.793"></a>
-<span class="sourceLineNo">794</span>            " last=" + Bytes.toStringBinary(lastKey));<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        LOG.debug("Region bounds: first=" +<a name="line.795"></a>
-<span class="sourceLineNo">796</span>            Bytes.toStringBinary(getRegionInfo().getStartKey()) +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>            " last=" + Bytes.toStringBinary(getRegionInfo().getEndKey()));<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      }<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      if (!this.getRegionInfo().containsRange(firstKey.get(), lastKey)) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>        throw new WrongRegionException(<a name="line.801"></a>
-<span class="sourceLineNo">802</span>            "Bulk load file " + srcPath.toString() + " does not fit inside region "<a name="line.802"></a>
-<span class="sourceLineNo">803</span>            + this.getRegionInfo().getRegionNameAsString());<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span>      if(reader.length() &gt; conf.getLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          HConstants.DEFAULT_MAX_FILE_SIZE)) {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        LOG.warn("Trying to bulk load hfile " + srcPath + " with size: " +<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            reader.length() + " bytes can be problematic as it may lead to oversplitting.");<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>      if (verifyBulkLoads) {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        long verificationStartTime = EnvironmentEdgeManager.currentTime();<a name="line.813"></a>
-<span class="sourceLineNo">814</span>        LOG.info("Full verification started for bulk load hfile: {}", srcPath);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>        Cell prevCell = null;<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        HFileScanner scanner = reader.getScanner(false, false, false);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        scanner.seekTo();<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        do {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>          Cell cell = scanner.getCell();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          if (prevCell != null) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>            if (comparator.compareRows(prevCell, cell) &gt; 0) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              throw new InvalidHFileException("Previous row is greater than"<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                  + " current row: path=" + srcPath + " previous="<a name="line.823"></a>
-<span class="sourceLineNo">824</span>                  + CellUtil.getCellKeyAsString(prevCell) + " current="<a name="line.824"></a>
-<span class="sourceLineNo">825</span>                  + CellUtil.getCellKeyAsString(cell));<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            if (CellComparator.getInstance().compareFamilies(prevCell, cell) != 0) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>              throw new InvalidHFileException("Previous key had different"<a name="line.828"></a>
-<span class="sourceLineNo">829</span>                  + " family compared to current key: path=" + srcPath<a name="line.829"></a>
-<span class="sourceLineNo">830</span>                  + " previous="<a name="line.830"></a>
-<span class="sourceLineNo">831</span>                  + Bytes.toStringBinary(prevCell.getFamilyArray(), prevCell.getFamilyOffset(),<a name="line.831"></a>
-<span class="sourceLineNo">832</span>                      prevCell.getFamilyLength())<a name="line.832"></a>
-<span class="sourceLineNo">833</span>                  + " current="<a name="line.833"></a>
-<span class="sourceLineNo">834</span>                  + Bytes.toStringBinary(cell.getFamilyArray(), cell.getFamilyOffset(),<a name="line.834"></a>
-<span class="sourceLineNo">835</span>                      cell.getFamilyLength()));<a name="line.835"></a>
-<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          prevCell = cell;<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } while (scanner.next());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      LOG.info("Full verification complete for bulk load hfile: " + srcPath.toString()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>         + " took " + (EnvironmentEdgeManager.currentTime() - verificationStartTime)<a name="line.841"></a>
-<span class="sourceLineNo">842</span>         + " ms");<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    } finally {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      if (reader != null) reader.close();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  /**<a name="line.849"></a>
-<span class="sourceLineNo">850</span>   * This method should only be called from Region. It is assumed that the ranges of values in the<a name="line.850"></a>
-<span class="sourceLineNo">851</span>   * HFile fit within the stores assigned region. (assertBulkLoadHFileOk checks this)<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   *<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * @param srcPathStr<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * @param seqNum sequence Id associated with the HFile<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  public Pair&lt;Path, Path&gt; preBulkLoadHFile(String srcPathStr, long seqNum) throws IOException {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    Path srcPath = new Path(srcPathStr);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    return fs.bulkLoadStoreFile(getColumnFamilyName(), srcPath, seqNum);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  }<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public Path bulkLoadHFile(byte[] family, String srcPathStr, Path dstPath) throws IOException {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    Path srcPath = new Path(srcPathStr);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    try {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      fs.commitStoreFile(srcPath, dstPath);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    } finally {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      if (this.getCoprocessorHost() != null) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        this.getCoprocessorHost().postCommitStoreFile(family, srcPath, dstPath);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>    LOG.info("Loaded HFile " + srcPath + " into store '" + getColumnFamilyName() + "' as "<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        + dstPath + " - updating store file list.");<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    HStoreFile sf = createStoreFileAndReader(dstPath);<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    bulkLoadHFile(sf);<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    LOG.info("Successfully loaded store file {} into store {} (new location: {})",<a name="line.877"></a>
-<span class="sourceLineNo">878</span>        srcPath, this, dstPath);<a name="line.878"></a>
-<span class="sourceLineNo">879</span><a name="line.879"></a>
-<span class="sourceLineNo">880</span>    return dstPath;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  }<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>  public void bulkLoadHFile(StoreFileInfo fileInfo) throws IOException {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    HStoreFile sf = createStoreFileAndReader(fileInfo);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    bulkLoadHFile(sf);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
-<span class="sourceLineNo">887</span><a name="line.887"></a>
-<span class="sourceLineNo">888</span>  private void bulkLoadHFile(HStoreFile sf) throws IOException {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    StoreFileReader r = sf.getReader();<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.storeSize.addAndGet(r.length());<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>    // Append the new storefile into the list<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    this.lock.writeLock().lock();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    try {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      this.storeEngine.getStoreFileManager().insertNewFiles(Lists.newArrayList(sf));<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    } finally {<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // We need the lock, as long as we are updating the storeFiles<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // or changing the memstore. Let us release it before calling<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      // notifyChangeReadersObservers. See HBASE-4485 for a possible<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      // deadlock scenario that could have happened if continue to hold<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      // the lock.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      this.lock.writeLock().unlock();<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    LOG.info("Loaded HFile " + sf.getFileInfo() + " into store '" + getColumnFamilyName());<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    if (LOG.isTraceEnabled()) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      String traceMessage = "BULK LOAD time,size,store size,store files ["<a name="line.907"></a>
-<span class="sourceLineNo">908</span>          + EnvironmentEdgeManager.currentTime() + "," + r.length() + "," + storeSize<a name="line.908"></a>
-<span class="sourceLineNo">909</span>          + "," + storeEngine.getStoreFileManager().getStorefileCount() + "]";<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      LOG.trace(traceMessage);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>  /**<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * Close all the readers We don't need to worry about subsequent requests because the Region holds<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   * a write lock that will prevent any more reads or writes.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>   * @return the {@link StoreFile StoreFiles} that were previously being used.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>   * @throws IOException on failure<a name="line.918"></a>
-<span class="sourceLineNo">919</span>   */<a name="line.919"></a>
-<span class="sourceLineNo">920</span>  public ImmutableCollection&lt;HStoreFile&gt; close() throws IOException {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    this.archiveLock.lock();<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    this.lock.writeLock().lock();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    try {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // Clear so metrics doesn't find them.<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      ImmutableCollection&lt;HStoreFile&gt; result = storeEngine.getStoreFileManager().clearFiles();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      Collection&lt;HStoreFile&gt; compactedfiles =<a name="line.926"></a>
-<span class="sourceLineNo">927</span>          storeEngine.getStoreFileManager().clearCompactedFiles();<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // clear the compacted files<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      if (CollectionUtils.isNotEmpty(compactedfiles)) {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>        removeCompactedfiles(compactedfiles, true);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      }<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (!result.isEmpty()) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        // initialize the thread pool for closing store files in parallel.<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        ThreadPoolExecutor storeFileCloserThreadPool = this.region<a name="line.934"></a>
-<span class="sourceLineNo">935</span>            .getStoreFileOpenAndCloseThreadPool("StoreFileCloserThread-"<a name="line.935"></a>
-<span class="sourceLineNo">936</span>              + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>        // close each store file in parallel<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        CompletionService&lt;Void&gt; completionService =<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          new ExecutorCompletionService&lt;&gt;(storeFileCloserThreadPool);<a name="line.940"></a>
-<span class="sourceLineNo">941</span>        for (HStoreFile f : result) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          completionService.submit(new Callable&lt;Void&gt;() {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>            @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>            public Void call() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>              boolean evictOnClose =<a name="line.945"></a>
-<span class="sourceLineNo">946</span>                  cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.946"></a>
-<span class="sourceLineNo">947</span>              f.closeStoreFile(evictOnClose);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>              return null;<a name="line.948"></a>
-<span class="sourceLineNo">949</span>            }<a name="line.949"></a>
-<span class="sourceLineNo">950</span>          });<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>        IOException ioe = null;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        try {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          for (int i = 0; i &lt; result.size(); i++) {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>            try {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>              Future&lt;Void&gt; future = completionService.take();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>              future.get();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>            } catch (InterruptedException e) {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>              if (ioe == null) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>                ioe = new InterruptedIOException();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>                ioe.initCause(e);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>              }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>            } catch (ExecutionException e) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>              if (ioe == null) ioe = new IOException(e.getCause());<a name="line.965"></a>
-<span class="sourceLineNo">966</span>            }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>          }<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        } finally {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          storeFileCloserThreadPool.shutdownNow();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        if (ioe != null) throw ioe;<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      LOG.trace("Closed {}", this);<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      return result;<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    } finally {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      this.lock.writeLock().unlock();<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      this.archiveLock.unlock();<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>  }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Snapshot this stores memstore. Call before running<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * {@link #flushCache(long, MemStoreSnapshot, MonitoredTask, ThroughputController,<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   * FlushLifeCycleTracker)}<a name="line.984"></a>
-<span class="sourceLineNo">985</span>   *  so it has some work to do.<a name="line.985"></a>
-<span class="sourceLineNo">986</span>   */<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  void snapshot() {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    this.lock.writeLock().lock();<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    try {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      this.memstore.snapshot();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    } finally {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      this.lock.writeLock().unlock();<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
-<span class="sourceLineNo">995</span><a name="line.995"></a>
-<span class="sourceLineNo">996</span>  /**<a name="line.996"></a>
-<span class="sourceLineNo">997</span>   * Write out current snapshot. Presumes {@link #snapshot()} has been called previously.<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   * @param logCacheFlushId flush sequence number<a name="line.998"></a>
-<span class="sourceLineNo">999</span>   * @param snapshot<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>   * @param status<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * @param throughputController<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * @return The path name of the tmp file to which the store was flushed<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @throws IOException if exception occurs during process<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   */<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>  protected List&lt;Path&gt; flushCache(final long logCacheFlushId, MemStoreSnapshot snapshot,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      MonitoredTask status, ThroughputController throughputController,<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      FlushLifeCycleTracker tracker) throws IOException {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    // If an exception happens flushing, we let it out without clearing<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    // the memstore snapshot.  The old snapshot will be returned when we say<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    // 'snapshot', the next time flush comes around.<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    // Retry after catching exception when flushing, otherwise server will abort<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    // itself<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    StoreFlusher flusher = storeEngine.getStoreFlusher();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    IOException lastException = null;<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    for (int i = 0; i &lt; flushRetriesNumber; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>      try {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        List&lt;Path&gt; pathNames =<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            flusher.flushSnapshot(snapshot, logCacheFlushId, status, throughputController, tracker);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        Path lastPathName = null;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        try {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          for (Path pathName : pathNames) {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>            lastPathName = pathName;<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            validateStoreFile(pathName);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>          return pathNames;<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        } catch (Exception e) {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>          LOG.warn("Failed validating store file {}, retrying num={}", lastPathName, i, e);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>          if (e instanceof IOException) {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>            lastException = (IOException) e;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          } else {<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>            lastException = new IOException(e);<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>          }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        }<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      } catch (IOException e) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        LOG.warn("Failed flushing store file, retrying num={}", i, e);<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        lastException = e;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>      }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      if (lastException != null &amp;&amp; i &lt; (flushRetriesNumber - 1)) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        try {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          Thread.sleep(pauseTime);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        } catch (InterruptedException e) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          IOException iie = new InterruptedIOException();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          iie.initCause(e);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>          throw iie;<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        }<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      }<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    throw lastException;<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>  }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>  /**<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>   * @param path The pathname of the tmp file into which the store was flushed<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>   * @param logCacheFlushId<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>   * @param status<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>   * @return store file created.<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>   * @throws IOException<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>   */<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>  private HStoreFile commitFile(Path path, long logCacheFlushId, MonitoredTask status)<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      throws IOException {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    // Write-out finished successfully, move into the right spot<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    Path dstPath = fs.commitStoreFile(getColumnFamilyName(), path);<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span><a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    status.setStatus("Flushing " + this + ": reopening flushed file");<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    HStoreFile sf = createStoreFileAndReader(dstPath);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span><a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    StoreFileReader r = sf.getReader();<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    this.storeSize.addAndGet(r.length());<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    this.totalUncompressedBytes.addAndGet(r.getTotalUncompressedBytes());<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    if (LOG.isInfoEnabled()) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      LOG.info("Added " + sf + ", entries=" + r.getEntries() +<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        ", sequenceid=" + logCacheFlushId +<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>        ", filesize=" + TraditionalBinaryPrefix.long2String(r.length(), "", 1));<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    return sf;<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>  }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>  /**<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>   * @param maxKeyCount<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>   * @param compression Compression algorithm to use<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>   * @param isCompaction whether we are creating a new file in a compaction<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>   * @param includeMVCCReadpoint - whether to include MVCC or not<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>   * @param includesTag - includesTag or not<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>   */<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>  // TODO : allow the Writer factory to create Writers of ShipperListener type only in case of<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  // compaction<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>  public StoreFileWriter createWriterInTmp(long maxKeyCount, Compression.Algorithm compression,<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      boolean isCompaction, boolean includeMVCCReadpoint, boolean includesTag,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      boolean shouldDropBehind) throws IOException {<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    final CacheConfig writerCacheConf;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    if (isCompaction) {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // Don't cache data on write on compactions.<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      writerCacheConf = new CacheConfig(cacheConf);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      writerCacheConf.setCacheDataOnWrite(false);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    } else {<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      writerCacheConf = cacheConf;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    InetSocketAddress[] favoredNodes = null;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    if (region.getRegionServerServices() != null) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      favoredNodes = region.getRegionServerServices().getFavoredNodesForRegion(<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          region.getRegionInfo().getEncodedName());<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    HFileContext hFileContext = createFileContext(compression, includeMVCCReadpoint, includesTag,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      cryptoContext);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    Path familyTempDir = new Path(fs.getTempDir(), family.getNameAsString());<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    StoreFileWriter.Builder builder = new StoreFileWriter.Builder(conf, writerCacheConf,<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        this.getFileSystem())<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>            .withOutputDir(familyTempDir)<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>            .withComparator(comparator)<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>            .withBloomType(family.getBloomFilterType())<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>            .withMaxKeyCount(maxKeyCount)<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>            .withFavoredNodes(favoredNodes)<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            .withFileContext(hFileContext)<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>            .withShouldDropCacheBehind(shouldDropBehind);<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    return builder.build();<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>  }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>  private HFileContext createFileContext(Compression.Algorithm compression,<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>      boolean includeMVCCReadpoint, boolean includesTag, Encryption.Context cryptoContext) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    if (compression == null) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      compression = HFile.DEFAULT_COMPRESSION_ALGORITHM;<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>    }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    HFileContext hFileContext = new HFileContextBuilder()<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>                                .withIncludesMvcc(includeMVCCReadpoint)<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                                .withIncludesTags(includesTag)<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>                                .withCompression(compression)<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>                                .withCompressTags(family.isCompressTags())<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>                                .withChecksumType(checksumType)<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>                                .withBytesPerCheckSum(bytesPerChecksum)<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>                                .withBlockSize(blocksize)<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>                                .withHBaseCheckSum(true)<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>                                .withDataBlockEncoding(family.getDataBlockEncoding())<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>                                .withEncryptionContext(cryptoContext)<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>                                .withCreateTime(EnvironmentEdgeManager.currentTime())<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>                                .build();<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    return hFileContext;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, "<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            + "parallelPutCountPrintThreshold={}, encoding={}, compression={}",<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        getColumnFamilyName(), memstore.getClass().getSimpleName(), policyName, verifyBulkLoads,<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        parallelPutCountPrintThreshold, family.getDataBlockEncoding(),<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        family.getCompressionType());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  /**<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @return MemStore Instance to use in this store.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  private MemStore getMemstore() {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    MemStore ms = null;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    if (this.getTableName().isSystemTable()) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    } else {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    if (inMemoryCompaction == null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      inMemoryCompaction =<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    switch (inMemoryCompaction) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      case NONE:<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            new Object[] { conf, this.comparator,<a name="line.355"></a>
+<span class="sourceLineNo">356</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        break;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      default:<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return ms;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * Creates the cache config.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param family The current column family.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>  /**<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * Creates the store engine configured for the given Store.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   *              being passed to coprocessors via the compactor.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @param conf Store configuration.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @return StoreEngine to use.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      CellComparator kvComparator) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return StoreEngine.create(store, conf, comparator);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  }<a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  /**<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * @param family<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * @return TTL in seconds of the specified family<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    long ttl = family.getTimeToLive();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    if (ttl == HConstants.FOREVER) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      // Default is unlimited ttl.<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      ttl = Long.MAX_VALUE;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    } else if (ttl == -1) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      ttl = Long.MAX_VALUE;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    } else {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      // Second -&gt; ms adjust for user data<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      ttl *= 1000;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    return ttl;<a name="line.404"></a>
+<span class="sou

<TRUNCATED>

[11/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        LOG.debug("

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class

<TRUNCATED>

[13/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a nam

<TRUNCATED>

[09/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></

<TRUNCATED>

[14/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></

<TRUNCATED>

[26/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
index 317bad9..7e4e8e7 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html
@@ -104,19 +104,27 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></span></code>
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></span></code>
+<div class="block">By Region, for 'region'  mode.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></span></code>
+<div class="block">Simple implementation of canary sink that allows plotting to a file or standard output.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></span></code>
+<div class="block">Output for 'zookeeper' mode.</div>
+</td>
 </tr>
 </tbody>
 </table>
@@ -138,6 +146,20 @@
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a> that return <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></code></td>
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#getSink-org.apache.hadoop.conf.Configuration-java.lang.Class-">getSink</a></span>(org.apache.hadoop.conf.Configuration&nbsp;configuration,
+       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&nbsp;clazz)</code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
 <caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a> with parameters of type <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
@@ -146,25 +168,25 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="../../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
      boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;readLatency)</code>
+<div class="block">Canary entry point for specified table.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
+     <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDesc,
      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
      boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;readLatency)</code>
-<div class="block">Canary entry point for specified table.</div>
-</td>
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
@@ -187,6 +209,38 @@
        boolean&nbsp;treatFailureAsError,
        long&nbsp;allowedFailures)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
+             boolean&nbsp;useRegExp,
+             <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+             boolean&nbsp;writeSniffing,
+             <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
+             boolean&nbsp;treatFailureAsError,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;configuredReadTableTimeouts,
+             long&nbsp;configuredWriteTableTimeout,
+             long&nbsp;allowedFailures)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
+                   boolean&nbsp;useRegExp,
+                   <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
+                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+                   boolean&nbsp;allRegions,
+                   boolean&nbsp;treatFailureAsError,
+                   long&nbsp;allowedFailures)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
+                boolean&nbsp;useRegExp,
+                <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+                boolean&nbsp;treatFailureAsError,
+                long&nbsp;allowedFailures)</code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html
index 7df55e0..bef2215 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html
@@ -104,55 +104,21 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></span></code>
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></span></code>
+<div class="block">By Region, for 'region'  mode.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></span></code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">
-<caption><span>Constructors in <a href="../../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a> with parameters of type <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colOne" scope="col">Constructor and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
-             boolean&nbsp;useRegExp,
-             <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-             boolean&nbsp;writeSniffing,
-             <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
-             boolean&nbsp;treatFailureAsError,
-             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;configuredReadTableTimeouts,
-             long&nbsp;configuredWriteTableTimeout,
-             long&nbsp;allowedFailures)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
-                   boolean&nbsp;useRegExp,
-                   <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-                   boolean&nbsp;allRegions,
-                   boolean&nbsp;treatFailureAsError,
-                   long&nbsp;allowedFailures)</code>&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
-                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
-                boolean&nbsp;useRegExp,
-                <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
-                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-                boolean&nbsp;treatFailureAsError,
-                long&nbsp;allowedFailures)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></span></code>
+<div class="block">Output for 'zookeeper' mode.</div>
+</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/package-summary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/package-summary.html b/devapidocs/org/apache/hadoop/hbase/tool/package-summary.html
index 7920f74..fd4e4ac 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/package-summary.html
@@ -84,7 +84,9 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">Sink interface used by the canary to output information</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/LoadIncrementalHFiles.BulkHFileVisitor.html" title="interface in org.apache.hadoop.hbase.tool">LoadIncrementalHFiles.BulkHFileVisitor</a>&lt;TFamily&gt;</td>
@@ -104,46 +106,56 @@
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></td>
 <td class="colLast">
-<div class="block">HBase Canary Tool, that that can be used to do
- "canary monitoring" of a running HBase cluster.</div>
+<div class="block">HBase Canary Tool for "canary monitoring" of a running HBase cluster.</div>
 </td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">A Monitor super-class can be extended by users</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">A monitor for region mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">A monitor for regionserver mode</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerTask</a></td>
 <td class="colLast">
-<div class="block">Get one row from a region on the regionserver and outputs the latency, or the failure.</div>
+<div class="block">Run a single RegionServer Task and then exit.</div>
 </td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">By Region, for 'region'  mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionTask</a></td>
 <td class="colLast">
-<div class="block">For each column family of the region tries to get one row and outputs the latency, or the
- failure.</div>
+<div class="block">Run a single Region Task and then exit.</div>
 </td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">Simple implementation of canary sink that allows plotting to a file or standard output.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperMonitor</a></td>
@@ -151,11 +163,15 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">Output for 'zookeeper' mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperTask</a></td>
-<td class="colLast">&nbsp;</td>
+<td class="colLast">
+<div class="block">Run a single zookeeper Task and then exit.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/tool/DataBlockEncodingValidator.html" title="class in org.apache.hadoop.hbase.tool">DataBlockEncodingValidator</a></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/package-use.html b/devapidocs/org/apache/hadoop/hbase/tool/package-use.html
index 2b33ca6..5e1d591 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/package-use.html
@@ -175,25 +175,37 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html#org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.Monitor.html#org.apache.hadoop.hbase.tool">Canary.Monitor</a>
+<div class="block">A Monitor super-class can be extended by users</div>
+</td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.RegionServerStdOutSink.html#org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.RegionServerStdOutSink.html#org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a>
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
+</td>
 </tr>
 <tr class="altColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.RegionStdOutSink.html#org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.RegionStdOutSink.html#org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a>
+<div class="block">By Region, for 'region'  mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.RegionTask.TaskType.html#org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html#org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.Sink.html#org.apache.hadoop.hbase.tool">Canary.Sink</a>
+<div class="block">Sink interface used by the canary to output information</div>
+</td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html#org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.StdOutSink.html#org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>
+<div class="block">Simple implementation of canary sink that allows plotting to a file or standard output.</div>
+</td>
 </tr>
 <tr class="altColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.ZookeeperStdOutSink.html#org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a>&nbsp;</td>
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/Canary.ZookeeperStdOutSink.html#org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a>
+<div class="block">Output for 'zookeeper' mode.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/tool/class-use/LoadIncrementalHFiles.BulkHFileVisitor.html#org.apache.hadoop.hbase.tool">LoadIncrementalHFiles.BulkHFileVisitor</a>&nbsp;</td>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.OperationStatusCode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.OperationStatusCode.html b/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.OperationStatusCode.html
index dd675cc..333b785 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.OperationStatusCode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.OperationStatusCode.html
@@ -1333,59 +1333,60 @@
 <span class="sourceLineNo">1325</span>    "hbase.regionserver.region.split.threads.max";<a name="line.1325"></a>
 <span class="sourceLineNo">1326</span><a name="line.1326"></a>
 <span class="sourceLineNo">1327</span>  /** Canary config keys */<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>  public static final String HBASE_CANARY_WRITE_DATA_TTL_KEY = "hbase.canary.write.data.ttl";<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span><a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY =<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      "hbase.canary.write.perserver.regions.lowerLimit";<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span><a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY =<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      "hbase.canary.write.perserver.regions.upperLimit";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span><a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  public static final String HBASE_CANARY_WRITE_VALUE_SIZE_KEY = "hbase.canary.write.value.size";<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  public static final String HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY =<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      "hbase.canary.write.table.check.period";<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span><a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  public static final String HBASE_CANARY_READ_RAW_SCAN_KEY = "hbase.canary.read.raw.enabled";<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Configuration keys for programmatic JAAS configuration for secured ZK interaction<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   */<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>  public static final String ZK_CLIENT_KEYTAB_FILE = "hbase.zookeeper.client.keytab.file";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>  public static final String ZK_CLIENT_KERBEROS_PRINCIPAL =<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      "hbase.zookeeper.client.kerberos.principal";<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>  public static final String ZK_SERVER_KEYTAB_FILE = "hbase.zookeeper.server.keytab.file";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  public static final String ZK_SERVER_KERBEROS_PRINCIPAL =<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      "hbase.zookeeper.server.kerberos.principal";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /** Config key for hbase temporary directory in hdfs */<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public static final String TEMPORARY_FS_DIRECTORY_KEY = "hbase.fs.tmp.dir";<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * Don't use it! This'll get you the wrong path in a secure cluster.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Use FileSystem.getHomeDirectory() or<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   */<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public static final String DEFAULT_TEMPORARY_HDFS_DIRECTORY = "/user/"<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      + System.getProperty("user.name") + "/hbase-staging";<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span><a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>  public static final String SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT =<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      "hbase.snapshot.restore.take.failsafe.snapshot";<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>  public static final boolean DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT = true;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>  public static final String SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      "hbase.snapshot.restore.failsafe.name";<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  public static final String DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      "hbase-failsafe-{snapshot.name}-{restore.timestamp}";<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>  public static final String DEFAULT_LOSSY_COUNTING_ERROR_RATE =<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      "hbase.util.default.lossycounting.errorrate";<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>  public static final String NOT_IMPLEMENTED = "Not implemented";<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>  private HConstants() {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    // Can't be instantiated with this ctor.<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>}<a name="line.1380"></a>
+<span class="sourceLineNo">1328</span>  // TODO: Move these defines to Canary Class<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public static final String HBASE_CANARY_WRITE_DATA_TTL_KEY = "hbase.canary.write.data.ttl";<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY =<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      "hbase.canary.write.perserver.regions.lowerLimit";<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span><a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY =<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      "hbase.canary.write.perserver.regions.upperLimit";<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span><a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>  public static final String HBASE_CANARY_WRITE_VALUE_SIZE_KEY = "hbase.canary.write.value.size";<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  public static final String HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY =<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      "hbase.canary.write.table.check.period";<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>  public static final String HBASE_CANARY_READ_RAW_SCAN_KEY = "hbase.canary.read.raw.enabled";<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span><a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  /**<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>   * Configuration keys for programmatic JAAS configuration for secured ZK interaction<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>   */<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>  public static final String ZK_CLIENT_KEYTAB_FILE = "hbase.zookeeper.client.keytab.file";<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  public static final String ZK_CLIENT_KERBEROS_PRINCIPAL =<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      "hbase.zookeeper.client.kerberos.principal";<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  public static final String ZK_SERVER_KEYTAB_FILE = "hbase.zookeeper.server.keytab.file";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  public static final String ZK_SERVER_KERBEROS_PRINCIPAL =<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      "hbase.zookeeper.server.kerberos.principal";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  /** Config key for hbase temporary directory in hdfs */<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  public static final String TEMPORARY_FS_DIRECTORY_KEY = "hbase.fs.tmp.dir";<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span><a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>  /**<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * Don't use it! This'll get you the wrong path in a secure cluster.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * Use FileSystem.getHomeDirectory() or<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   */<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  public static final String DEFAULT_TEMPORARY_HDFS_DIRECTORY = "/user/"<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      + System.getProperty("user.name") + "/hbase-staging";<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>  public static final String SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT =<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      "hbase.snapshot.restore.take.failsafe.snapshot";<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>  public static final boolean DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT = true;<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span><a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>  public static final String SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      "hbase.snapshot.restore.failsafe.name";<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  public static final String DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>      "hbase-failsafe-{snapshot.name}-{restore.timestamp}";<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span><a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>  public static final String DEFAULT_LOSSY_COUNTING_ERROR_RATE =<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      "hbase.util.default.lossycounting.errorrate";<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>  public static final String NOT_IMPLEMENTED = "Not implemented";<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>  private HConstants() {<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    // Can't be instantiated with this ctor.<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>}<a name="line.1381"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.html b/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.html
index dd675cc..333b785 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/HConstants.html
@@ -1333,59 +1333,60 @@
 <span class="sourceLineNo">1325</span>    "hbase.regionserver.region.split.threads.max";<a name="line.1325"></a>
 <span class="sourceLineNo">1326</span><a name="line.1326"></a>
 <span class="sourceLineNo">1327</span>  /** Canary config keys */<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>  public static final String HBASE_CANARY_WRITE_DATA_TTL_KEY = "hbase.canary.write.data.ttl";<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span><a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY =<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      "hbase.canary.write.perserver.regions.lowerLimit";<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span><a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY =<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      "hbase.canary.write.perserver.regions.upperLimit";<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span><a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>  public static final String HBASE_CANARY_WRITE_VALUE_SIZE_KEY = "hbase.canary.write.value.size";<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  public static final String HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY =<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      "hbase.canary.write.table.check.period";<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span><a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  public static final String HBASE_CANARY_READ_RAW_SCAN_KEY = "hbase.canary.read.raw.enabled";<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Configuration keys for programmatic JAAS configuration for secured ZK interaction<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   */<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>  public static final String ZK_CLIENT_KEYTAB_FILE = "hbase.zookeeper.client.keytab.file";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>  public static final String ZK_CLIENT_KERBEROS_PRINCIPAL =<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      "hbase.zookeeper.client.kerberos.principal";<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>  public static final String ZK_SERVER_KEYTAB_FILE = "hbase.zookeeper.server.keytab.file";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>  public static final String ZK_SERVER_KERBEROS_PRINCIPAL =<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      "hbase.zookeeper.server.kerberos.principal";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span><a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>  /** Config key for hbase temporary directory in hdfs */<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>  public static final String TEMPORARY_FS_DIRECTORY_KEY = "hbase.fs.tmp.dir";<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span><a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>  /**<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * Don't use it! This'll get you the wrong path in a secure cluster.<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * Use FileSystem.getHomeDirectory() or<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   * "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>   */<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public static final String DEFAULT_TEMPORARY_HDFS_DIRECTORY = "/user/"<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      + System.getProperty("user.name") + "/hbase-staging";<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span><a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>  public static final String SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT =<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      "hbase.snapshot.restore.take.failsafe.snapshot";<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>  public static final boolean DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT = true;<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span><a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>  public static final String SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      "hbase.snapshot.restore.failsafe.name";<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>  public static final String DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      "hbase-failsafe-{snapshot.name}-{restore.timestamp}";<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span><a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>  public static final String DEFAULT_LOSSY_COUNTING_ERROR_RATE =<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      "hbase.util.default.lossycounting.errorrate";<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>  public static final String NOT_IMPLEMENTED = "Not implemented";<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>  private HConstants() {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    // Can't be instantiated with this ctor.<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>}<a name="line.1380"></a>
+<span class="sourceLineNo">1328</span>  // TODO: Move these defines to Canary Class<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>  public static final String HBASE_CANARY_WRITE_DATA_TTL_KEY = "hbase.canary.write.data.ttl";<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY =<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      "hbase.canary.write.perserver.regions.lowerLimit";<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span><a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>  public static final String HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY =<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      "hbase.canary.write.perserver.regions.upperLimit";<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span><a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>  public static final String HBASE_CANARY_WRITE_VALUE_SIZE_KEY = "hbase.canary.write.value.size";<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span><a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  public static final String HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY =<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>      "hbase.canary.write.table.check.period";<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span><a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>  public static final String HBASE_CANARY_READ_RAW_SCAN_KEY = "hbase.canary.read.raw.enabled";<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span><a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  /**<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>   * Configuration keys for programmatic JAAS configuration for secured ZK interaction<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>   */<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>  public static final String ZK_CLIENT_KEYTAB_FILE = "hbase.zookeeper.client.keytab.file";<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>  public static final String ZK_CLIENT_KERBEROS_PRINCIPAL =<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      "hbase.zookeeper.client.kerberos.principal";<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>  public static final String ZK_SERVER_KEYTAB_FILE = "hbase.zookeeper.server.keytab.file";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>  public static final String ZK_SERVER_KERBEROS_PRINCIPAL =<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      "hbase.zookeeper.server.kerberos.principal";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span><a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>  /** Config key for hbase temporary directory in hdfs */<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  public static final String TEMPORARY_FS_DIRECTORY_KEY = "hbase.fs.tmp.dir";<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span><a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>  /**<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>   * Don't use it! This'll get you the wrong path in a secure cluster.<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>   * Use FileSystem.getHomeDirectory() or<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>   * "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>   */<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>  public static final String DEFAULT_TEMPORARY_HDFS_DIRECTORY = "/user/"<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>      + System.getProperty("user.name") + "/hbase-staging";<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>  public static final String SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT =<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      "hbase.snapshot.restore.take.failsafe.snapshot";<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>  public static final boolean DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT = true;<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span><a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>  public static final String SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      "hbase.snapshot.restore.failsafe.name";<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  public static final String DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME =<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>      "hbase-failsafe-{snapshot.name}-{restore.timestamp}";<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span><a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>  public static final String DEFAULT_LOSSY_COUNTING_ERROR_RATE =<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>      "hbase.util.default.lossycounting.errorrate";<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>  public static final String NOT_IMPLEMENTED = "Not implemented";<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>  private HConstants() {<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    // Can't be instantiated with this ctor.<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>}<a name="line.1381"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/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 9155e8b..aa4b275 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Tue Oct 16 14:45:42 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Wed Oct 17 14:44:35 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "461477f21f10a475e76871b5c40f2a48";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "021f466e549ff8f55d92edf9e3d7ac87";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[10/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class="sourceLineNo"

<TRUNCATED>

[02/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
index da0a780..a09b4ea 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
@@ -384,512 +384,513 @@
 <span class="sourceLineNo">376</span>    for (Compression.Algorithm algo : COMPRESSION_ALGORITHMS) {<a name="line.376"></a>
 <span class="sourceLineNo">377</span>      for (boolean pread : new boolean[] { false, true }) {<a name="line.377"></a>
 <span class="sourceLineNo">378</span>        for (DataBlockEncoding encoding : DataBlockEncoding.values()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "blocks_v2_"<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              + algo + "_" + encoding.toString());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          FSDataOutputStream os = fs.create(path);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          HFileDataBlockEncoder dataBlockEncoder = (encoding != DataBlockEncoding.NONE) ?<a name="line.382"></a>
-<span class="sourceLineNo">383</span>              new HFileDataBlockEncoderImpl(encoding) : NoOpDataBlockEncoder.INSTANCE;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          HFileContext meta = new HFileContextBuilder()<a name="line.384"></a>
-<span class="sourceLineNo">385</span>                              .withCompression(algo)<a name="line.385"></a>
-<span class="sourceLineNo">386</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.386"></a>
-<span class="sourceLineNo">387</span>                              .withIncludesTags(includesTag)<a name="line.387"></a>
-<span class="sourceLineNo">388</span>                              .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.388"></a>
-<span class="sourceLineNo">389</span>                              .build();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          HFileBlock.Writer hbw = new HFileBlock.Writer(dataBlockEncoder, meta);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          long totalSize = 0;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          final List&lt;Integer&gt; encodedSizes = new ArrayList&lt;&gt;();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          final List&lt;ByteBuffer&gt; encodedBlocks = new ArrayList&lt;&gt;();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            hbw.startWriting(BlockType.DATA);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            writeTestKeyValues(hbw, blockId, includesMemstoreTS, includesTag);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            hbw.writeHeaderAndData(os);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            int headerLen = HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            byte[] encodedResultWithHeader = hbw.cloneUncompressedBufferWithHeader().array();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            final int encodedSize = encodedResultWithHeader.length - headerLen;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              // We need to account for the two-byte encoding algorithm ID that<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              // comes after the 24-byte block header but before encoded KVs.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>              headerLen += DataBlockEncoding.ID_SIZE;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>            }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>            byte[] encodedDataSection =<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                new byte[encodedResultWithHeader.length - headerLen];<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            System.arraycopy(encodedResultWithHeader, headerLen,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                encodedDataSection, 0, encodedDataSection.length);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            final ByteBuffer encodedBuf =<a name="line.410"></a>
-<span class="sourceLineNo">411</span>                ByteBuffer.wrap(encodedDataSection);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            encodedSizes.add(encodedSize);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            encodedBlocks.add(encodedBuf);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            totalSize += hbw.getOnDiskSizeWithHeader();<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          os.close();<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>          FSDataInputStream is = fs.open(path);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          meta = new HFileContextBuilder()<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                .withHBaseCheckSum(true)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                .withCompression(algo)<a name="line.421"></a>
-<span class="sourceLineNo">422</span>                .withIncludesMvcc(includesMemstoreTS)<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                .withIncludesTags(includesTag)<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                .build();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          HFileBlock.FSReaderImpl hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>          hbr.setDataBlockEncoder(dataBlockEncoder);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          hbr.setIncludesMemStoreTS(includesMemstoreTS);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          HFileBlock blockFromHFile, blockUnpacked;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          int pos = 0;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            blockFromHFile = hbr.readBlockData(pos, -1, pread, false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            blockFromHFile.sanityCheck();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            pos += blockFromHFile.getOnDiskSizeWithHeader();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            assertEquals((int) encodedSizes.get(blockId),<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              blockFromHFile.getUncompressedSizeWithoutHeader());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>            assertEquals(meta.isCompressedOrEncrypted(), !blockFromHFile.isUnpacked());<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            long packedHeapsize = blockFromHFile.heapSize();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>            blockUnpacked = blockFromHFile.unpack(meta, hbr);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            assertTrue(blockUnpacked.isUnpacked());<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            if (meta.isCompressedOrEncrypted()) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>              LOG.info("packedHeapsize=" + packedHeapsize + ", unpackedHeadsize=" + blockUnpacked<a name="line.442"></a>
-<span class="sourceLineNo">443</span>                .heapSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              assertFalse(packedHeapsize == blockUnpacked.heapSize());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              assertTrue("Packed heapSize should be &lt; unpacked heapSize",<a name="line.445"></a>
-<span class="sourceLineNo">446</span>                packedHeapsize &lt; blockUnpacked.heapSize());<a name="line.446"></a>
-<span class="sourceLineNo">447</span>            }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            ByteBuff actualBuffer = blockUnpacked.getBufferWithoutHeader();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              // We expect a two-byte big-endian encoding id.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              assertEquals(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>                "Unexpected first byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.452"></a>
-<span class="sourceLineNo">453</span>                Long.toHexString(0), Long.toHexString(actualBuffer.get(0)));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>              assertEquals(<a name="line.454"></a>
-<span class="sourceLineNo">455</span>                "Unexpected second byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.455"></a>
-<span class="sourceLineNo">456</span>                Long.toHexString(encoding.getId()), Long.toHexString(actualBuffer.get(1)));<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              actualBuffer.position(2);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>              actualBuffer = actualBuffer.slice();<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>            ByteBuffer expectedBuffer = encodedBlocks.get(blockId);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>            expectedBuffer.rewind();<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>            // test if content matches, produce nice message<a name="line.464"></a>
-<span class="sourceLineNo">465</span>            assertBuffersEqual(new SingleByteBuff(expectedBuffer), actualBuffer, algo, encoding,<a name="line.465"></a>
-<span class="sourceLineNo">466</span>                pread);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>            // test serialized blocks<a name="line.468"></a>
-<span class="sourceLineNo">469</span>            for (boolean reuseBuffer : new boolean[] { false, true }) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>              ByteBuffer serialized = ByteBuffer.allocate(blockFromHFile.getSerializedLength());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              blockFromHFile.serialize(serialized, true);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              HFileBlock deserialized =<a name="line.472"></a>
-<span class="sourceLineNo">473</span>                  (HFileBlock) blockFromHFile.getDeserializer().deserialize(<a name="line.473"></a>
-<span class="sourceLineNo">474</span>                    new SingleByteBuff(serialized), reuseBuffer, MemoryType.EXCLUSIVE);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>              assertEquals(<a name="line.475"></a>
-<span class="sourceLineNo">476</span>                "Serialization did not preserve block state. reuseBuffer=" + reuseBuffer,<a name="line.476"></a>
-<span class="sourceLineNo">477</span>                blockFromHFile, deserialized);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>              // intentional reference comparison<a name="line.478"></a>
-<span class="sourceLineNo">479</span>              if (blockFromHFile != blockUnpacked) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>                assertEquals("Deserializaed block cannot be unpacked correctly.",<a name="line.480"></a>
-<span class="sourceLineNo">481</span>                  blockUnpacked, deserialized.unpack(meta, hbr));<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>          }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          is.close();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  static String buildMessageDetails(Algorithm compression, DataBlockEncoding encoding,<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      boolean pread) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    return String.format("compression %s, encoding %s, pread %s", compression, encoding, pread);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>  static void assertBuffersEqual(ByteBuff expectedBuffer,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      ByteBuff actualBuffer, Compression.Algorithm compression,<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      DataBlockEncoding encoding, boolean pread) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    if (!actualBuffer.equals(expectedBuffer)) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      int prefix = 0;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      int minLimit = Math.min(expectedBuffer.limit(), actualBuffer.limit());<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      while (prefix &lt; minLimit &amp;&amp;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          expectedBuffer.get(prefix) == actualBuffer.get(prefix)) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        prefix++;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      fail(String.format(<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          "Content mismatch for %s, commonPrefix %d, expected %s, got %s",<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          buildMessageDetails(compression, encoding, pread), prefix,<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          nextBytesToStr(expectedBuffer, prefix),<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          nextBytesToStr(actualBuffer, prefix)));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<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>   * Convert a few next bytes in the given buffer at the given position to<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * string. Used for error messages.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  private static String nextBytesToStr(ByteBuff buf, int pos) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    int maxBytes = buf.limit() - pos;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    int numBytes = Math.min(16, maxBytes);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    return Bytes.toStringBinary(buf.array(), buf.arrayOffset() + pos,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        numBytes) + (numBytes &lt; maxBytes ? "..." : "");<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>  @Test<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  public void testPreviousOffset() throws IOException {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    testPreviousOffsetInternals();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>  protected void testPreviousOffsetInternals() throws IOException {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    // TODO: parameterize these nested loops.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    for (Compression.Algorithm algo : COMPRESSION_ALGORITHMS) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      for (boolean pread : BOOLEAN_VALUES) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        for (boolean cacheOnWrite : BOOLEAN_VALUES) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          Random rand = defaultRandom();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          LOG.info("testPreviousOffset:Compression algorithm: " + algo +<a name="line.537"></a>
-<span class="sourceLineNo">538</span>                   ", pread=" + pread +<a name="line.538"></a>
-<span class="sourceLineNo">539</span>                   ", cacheOnWrite=" + cacheOnWrite);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "prev_offset");<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          List&lt;Long&gt; expectedOffsets = new ArrayList&lt;&gt;();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          List&lt;Long&gt; expectedPrevOffsets = new ArrayList&lt;&gt;();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          List&lt;BlockType&gt; expectedTypes = new ArrayList&lt;&gt;();<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          List&lt;ByteBuffer&gt; expectedContents = cacheOnWrite ? new ArrayList&lt;&gt;() : null;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          long totalSize = writeBlocks(rand, algo, path, expectedOffsets,<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              expectedPrevOffsets, expectedTypes, expectedContents);<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>          FSDataInputStream is = fs.open(path);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          HFileContext meta = new HFileContextBuilder()<a name="line.549"></a>
-<span class="sourceLineNo">550</span>                              .withHBaseCheckSum(true)<a name="line.550"></a>
-<span class="sourceLineNo">551</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.551"></a>
-<span class="sourceLineNo">552</span>                              .withIncludesTags(includesTag)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>                              .withCompression(algo).build();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>          long curOffset = 0;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>          for (int i = 0; i &lt; NUM_TEST_BLOCKS; ++i) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            if (!pread) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>              assertEquals(is.getPos(), curOffset + (i == 0 ? 0 :<a name="line.558"></a>
-<span class="sourceLineNo">559</span>                HConstants.HFILEBLOCK_HEADER_SIZE));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>            }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>            assertEquals(expectedOffsets.get(i).longValue(), curOffset);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            if (detailedLogging) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>              LOG.info("Reading block #" + i + " at offset " + curOffset);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>            HFileBlock b = hbr.readBlockData(curOffset, -1, pread, false);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>            if (detailedLogging) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>              LOG.info("Block #" + i + ": " + b);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>            }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>            assertEquals("Invalid block #" + i + "'s type:",<a name="line.570"></a>
-<span class="sourceLineNo">571</span>                expectedTypes.get(i), b.getBlockType());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            assertEquals("Invalid previous block offset for block " + i<a name="line.572"></a>
-<span class="sourceLineNo">573</span>                + " of " + "type " + b.getBlockType() + ":",<a name="line.573"></a>
-<span class="sourceLineNo">574</span>                (long) expectedPrevOffsets.get(i), b.getPrevBlockOffset());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            b.sanityCheck();<a name="line.575"></a>
-<span class="sourceLineNo">576</span>            assertEquals(curOffset, b.getOffset());<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>            // Now re-load this block knowing the on-disk size. This tests a<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            // different branch in the loader.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            HFileBlock b2 = hbr.readBlockData(curOffset, b.getOnDiskSizeWithHeader(), pread, false);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            b2.sanityCheck();<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>            assertEquals(b.getBlockType(), b2.getBlockType());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            assertEquals(b.getOnDiskSizeWithoutHeader(),<a name="line.584"></a>
-<span class="sourceLineNo">585</span>                b2.getOnDiskSizeWithoutHeader());<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            assertEquals(b.getOnDiskSizeWithHeader(),<a name="line.586"></a>
-<span class="sourceLineNo">587</span>                b2.getOnDiskSizeWithHeader());<a name="line.587"></a>
-<span class="sourceLineNo">588</span>            assertEquals(b.getUncompressedSizeWithoutHeader(),<a name="line.588"></a>
-<span class="sourceLineNo">589</span>                b2.getUncompressedSizeWithoutHeader());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            assertEquals(b.getPrevBlockOffset(), b2.getPrevBlockOffset());<a name="line.590"></a>
-<span class="sourceLineNo">591</span>            assertEquals(curOffset, b2.getOffset());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            assertEquals(b.getBytesPerChecksum(), b2.getBytesPerChecksum());<a name="line.592"></a>
-<span class="sourceLineNo">593</span>            assertEquals(b.getOnDiskDataSizeWithHeader(),<a name="line.593"></a>
-<span class="sourceLineNo">594</span>                         b2.getOnDiskDataSizeWithHeader());<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>            curOffset += b.getOnDiskSizeWithHeader();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>            if (cacheOnWrite) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>              // NOTE: cache-on-write testing doesn't actually involve a BlockCache. It simply<a name="line.600"></a>
-<span class="sourceLineNo">601</span>              // verifies that the unpacked value read back off disk matches the unpacked value<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              // generated before writing to disk.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              b = b.unpack(meta, hbr);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>              // b's buffer has header + data + checksum while<a name="line.604"></a>
-<span class="sourceLineNo">605</span>              // expectedContents have header + data only<a name="line.605"></a>
-<span class="sourceLineNo">606</span>              ByteBuff bufRead = b.getBufferReadOnly();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>              ByteBuffer bufExpected = expectedContents.get(i);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>              boolean bytesAreCorrect = Bytes.compareTo(bufRead.array(),<a name="line.608"></a>
-<span class="sourceLineNo">609</span>                  bufRead.arrayOffset(),<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                  bufRead.limit() - b.totalChecksumBytes(),<a name="line.610"></a>
-<span class="sourceLineNo">611</span>                  bufExpected.array(), bufExpected.arrayOffset(),<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                  bufExpected.limit()) == 0;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>              String wrongBytesMsg = "";<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>              if (!bytesAreCorrect) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>                // Optimization: only construct an error message in case we<a name="line.616"></a>
-<span class="sourceLineNo">617</span>                // will need it.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>                wrongBytesMsg = "Expected bytes in block #" + i + " (algo="<a name="line.618"></a>
-<span class="sourceLineNo">619</span>                    + algo + ", pread=" + pread<a name="line.619"></a>
-<span class="sourceLineNo">620</span>                    + ", cacheOnWrite=" + cacheOnWrite + "):\n";<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                wrongBytesMsg += Bytes.toStringBinary(bufExpected.array(),<a name="line.621"></a>
-<span class="sourceLineNo">622</span>                  bufExpected.arrayOffset(), Math.min(32 + 10, bufExpected.limit()))<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                    + ", actual:\n"<a name="line.623"></a>
-<span class="sourceLineNo">624</span>                    + Bytes.toStringBinary(bufRead.array(),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>                  bufRead.arrayOffset(), Math.min(32 + 10, bufRead.limit()));<a name="line.625"></a>
-<span class="sourceLineNo">626</span>                if (detailedLogging) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>                  LOG.warn("expected header" +<a name="line.627"></a>
-<span class="sourceLineNo">628</span>                           HFileBlock.toStringHeader(new SingleByteBuff(bufExpected)) +<a name="line.628"></a>
-<span class="sourceLineNo">629</span>                           "\nfound    header" +<a name="line.629"></a>
-<span class="sourceLineNo">630</span>                           HFileBlock.toStringHeader(bufRead));<a name="line.630"></a>
-<span class="sourceLineNo">631</span>                  LOG.warn("bufread offset " + bufRead.arrayOffset() +<a name="line.631"></a>
-<span class="sourceLineNo">632</span>                           " limit " + bufRead.limit() +<a name="line.632"></a>
-<span class="sourceLineNo">633</span>                           " expected offset " + bufExpected.arrayOffset() +<a name="line.633"></a>
-<span class="sourceLineNo">634</span>                           " limit " + bufExpected.limit());<a name="line.634"></a>
-<span class="sourceLineNo">635</span>                  LOG.warn(wrongBytesMsg);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>                }<a name="line.636"></a>
-<span class="sourceLineNo">637</span>              }<a name="line.637"></a>
-<span class="sourceLineNo">638</span>              assertTrue(wrongBytesMsg, bytesAreCorrect);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>            }<a name="line.639"></a>
-<span class="sourceLineNo">640</span>          }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>          assertEquals(curOffset, fs.getFileStatus(path).getLen());<a name="line.642"></a>
-<span class="sourceLineNo">643</span>          is.close();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        }<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    }<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 Random defaultRandom() {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    return new Random(189237);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>  private class BlockReaderThread implements Callable&lt;Boolean&gt; {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    private final String clientId;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    private final HFileBlock.FSReader hbr;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    private final List&lt;Long&gt; offsets;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    private final List&lt;BlockType&gt; types;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    private final long fileSize;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    public BlockReaderThread(String clientId,<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        HFileBlock.FSReader hbr, List&lt;Long&gt; offsets, List&lt;BlockType&gt; types,<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        long fileSize) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      this.clientId = clientId;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      this.offsets = offsets;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      this.hbr = hbr;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      this.types = types;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      this.fileSize = fileSize;<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>    @Override<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    public Boolean call() throws Exception {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      Random rand = new Random(clientId.hashCode());<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      long endTime = System.currentTimeMillis() + 10000;<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      int numBlocksRead = 0;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      int numPositionalRead = 0;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      int numWithOnDiskSize = 0;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      while (System.currentTimeMillis() &lt; endTime) {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        int blockId = rand.nextInt(NUM_TEST_BLOCKS);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>        long offset = offsets.get(blockId);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        // now we only support concurrent read with pread = true<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        boolean pread = true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        boolean withOnDiskSize = rand.nextBoolean();<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        long expectedSize =<a name="line.683"></a>
-<span class="sourceLineNo">684</span>          (blockId == NUM_TEST_BLOCKS - 1 ? fileSize<a name="line.684"></a>
-<span class="sourceLineNo">685</span>              : offsets.get(blockId + 1)) - offset;<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>        HFileBlock b;<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        try {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>          long onDiskSizeArg = withOnDiskSize ? expectedSize : -1;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          b = hbr.readBlockData(offset, onDiskSizeArg, pread, false);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        } catch (IOException ex) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          LOG.error("Error in client " + clientId + " trying to read block at "<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              + offset + ", pread=" + pread + ", withOnDiskSize=" +<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              withOnDiskSize, ex);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>          return false;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>        }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>        assertEquals(types.get(blockId), b.getBlockType());<a name="line.698"></a>
-<span class="sourceLineNo">699</span>        assertEquals(expectedSize, b.getOnDiskSizeWithHeader());<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        assertEquals(offset, b.getOffset());<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>        ++numBlocksRead;<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        if (pread)<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          ++numPositionalRead;<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        if (withOnDiskSize)<a name="line.705"></a>
-<span class="sourceLineNo">706</span>          ++numWithOnDiskSize;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      }<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      LOG.info("Client " + clientId + " successfully read " + numBlocksRead +<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        " blocks (with pread: " + numPositionalRead + ", with onDiskSize " +<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        "specified: " + numWithOnDiskSize + ")");<a name="line.710"></a>
-<span class="sourceLineNo">711</span><a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return true;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  }<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>  @Test<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public void testConcurrentReading() throws Exception {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    testConcurrentReadingInternals();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void testConcurrentReadingInternals() throws IOException,<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      InterruptedException, ExecutionException {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (Compression.Algorithm compressAlgo : COMPRESSION_ALGORITHMS) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Path path = new Path(TEST_UTIL.getDataTestDir(), "concurrent_reading");<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      Random rand = defaultRandom();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      List&lt;Long&gt; offsets = new ArrayList&lt;&gt;();<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      List&lt;BlockType&gt; types = new ArrayList&lt;&gt;();<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      writeBlocks(rand, compressAlgo, path, offsets, null, types, null);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      FSDataInputStream is = fs.open(path);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      long fileSize = fs.getFileStatus(path).getLen();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      HFileContext meta = new HFileContextBuilder()<a name="line.732"></a>
-<span class="sourceLineNo">733</span>                          .withHBaseCheckSum(true)<a name="line.733"></a>
-<span class="sourceLineNo">734</span>                          .withIncludesMvcc(includesMemstoreTS)<a name="line.734"></a>
-<span class="sourceLineNo">735</span>                          .withIncludesTags(includesTag)<a name="line.735"></a>
-<span class="sourceLineNo">736</span>                          .withCompression(compressAlgo)<a name="line.736"></a>
-<span class="sourceLineNo">737</span>                          .build();<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(is, fileSize, meta);<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>      Executor exec = Executors.newFixedThreadPool(NUM_READER_THREADS);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      ExecutorCompletionService&lt;Boolean&gt; ecs = new ExecutorCompletionService&lt;&gt;(exec);<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      for (int i = 0; i &lt; NUM_READER_THREADS; ++i) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        ecs.submit(new BlockReaderThread("reader_" + (char) ('A' + i), hbr,<a name="line.744"></a>
-<span class="sourceLineNo">745</span>            offsets, types, fileSize));<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      }<a name="line.746"></a>
-<span class="sourceLineNo">747</span><a name="line.747"></a>
-<span class="sourceLineNo">748</span>      for (int i = 0; i &lt; NUM_READER_THREADS; ++i) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        Future&lt;Boolean&gt; result = ecs.take();<a name="line.749"></a>
-<span class="sourceLineNo">750</span>        assertTrue(result.get());<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        if (detailedLogging) {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>          LOG.info(String.valueOf(i + 1)<a name="line.752"></a>
-<span class="sourceLineNo">753</span>            + " reader threads finished successfully (algo=" + compressAlgo<a name="line.753"></a>
-<span class="sourceLineNo">754</span>            + ")");<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        }<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>      is.close();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>  private long writeBlocks(Random rand, Compression.Algorithm compressAlgo,<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path path, List&lt;Long&gt; expectedOffsets, List&lt;Long&gt; expectedPrevOffsets,<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      List&lt;BlockType&gt; expectedTypes, List&lt;ByteBuffer&gt; expectedContents<a name="line.764"></a>
-<span class="sourceLineNo">765</span>  ) throws IOException {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    boolean cacheOnWrite = expectedContents != null;<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    FSDataOutputStream os = fs.create(path);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    HFileContext meta = new HFileContextBuilder()<a name="line.768"></a>
-<span class="sourceLineNo">769</span>                        .withHBaseCheckSum(true)<a name="line.769"></a>
-<span class="sourceLineNo">770</span>                        .withIncludesMvcc(includesMemstoreTS)<a name="line.770"></a>
-<span class="sourceLineNo">771</span>                        .withIncludesTags(includesTag)<a name="line.771"></a>
-<span class="sourceLineNo">772</span>                        .withCompression(compressAlgo)<a name="line.772"></a>
-<span class="sourceLineNo">773</span>                        .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.773"></a>
-<span class="sourceLineNo">774</span>                        .build();<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    HFileBlock.Writer hbw = new HFileBlock.Writer(null, meta);<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    Map&lt;BlockType, Long&gt; prevOffsetByType = new HashMap&lt;&gt;();<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    long totalSize = 0;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    for (int i = 0; i &lt; NUM_TEST_BLOCKS; ++i) {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      long pos = os.getPos();<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      int blockTypeOrdinal = rand.nextInt(BlockType.values().length);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      if (blockTypeOrdinal == BlockType.ENCODED_DATA.ordinal()) {<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        blockTypeOrdinal = BlockType.DATA.ordinal();<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      BlockType bt = BlockType.values()[blockTypeOrdinal];<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      DataOutputStream dos = hbw.startWriting(bt);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      int size = rand.nextInt(500);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      for (int j = 0; j &lt; size; ++j) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>        // This might compress well.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>        dos.writeShort(i + 1);<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        dos.writeInt(j + 1);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>      if (expectedOffsets != null)<a name="line.793"></a>
-<span class="sourceLineNo">794</span>        expectedOffsets.add(os.getPos());<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      if (expectedPrevOffsets != null) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        Long prevOffset = prevOffsetByType.get(bt);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        expectedPrevOffsets.add(prevOffset != null ? prevOffset : -1);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        prevOffsetByType.put(bt, os.getPos());<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      }<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>      expectedTypes.add(bt);<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>      hbw.writeHeaderAndData(os);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      totalSize += hbw.getOnDiskSizeWithHeader();<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if (cacheOnWrite)<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        expectedContents.add(hbw.cloneUncompressedBufferWithHeader());<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>      if (detailedLogging) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>        LOG.info("Written block #" + i + " of type " + bt<a name="line.811"></a>
-<span class="sourceLineNo">812</span>            + ", uncompressed size " + hbw.getUncompressedSizeWithoutHeader()<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            + ", packed size " + hbw.getOnDiskSizeWithoutHeader()<a name="line.813"></a>
-<span class="sourceLineNo">814</span>            + " at offset " + pos);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      }<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    os.close();<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    LOG.info("Created a temporary file at " + path + ", "<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        + fs.getFileStatus(path).getLen() + " byte, compression=" +<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        compressAlgo);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    return totalSize;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
-<span class="sourceLineNo">823</span><a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Test<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public void testBlockHeapSize() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    testBlockHeapSizeInternals();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  protected void testBlockHeapSizeInternals() {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    if (ClassSize.is32BitJVM()) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      assertEquals(64, HFileBlock.MULTI_BYTE_BUFFER_HEAP_SIZE);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    } else {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(72, HFileBlock.MULTI_BYTE_BUFFER_HEAP_SIZE);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    }<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>    for (int size : new int[] { 100, 256, 12345 }) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      byte[] byteArr = new byte[HConstants.HFILEBLOCK_HEADER_SIZE + size];<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      ByteBuffer buf = ByteBuffer.wrap(byteArr, 0, size);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      HFileContext meta = new HFileContextBuilder()<a name="line.839"></a>
-<span class="sourceLineNo">840</span>                          .withIncludesMvcc(includesMemstoreTS)<a name="line.840"></a>
-<span class="sourceLineNo">841</span>                          .withIncludesTags(includesTag)<a name="line.841"></a>
-<span class="sourceLineNo">842</span>                          .withHBaseCheckSum(false)<a name="line.842"></a>
-<span class="sourceLineNo">843</span>                          .withCompression(Algorithm.NONE)<a name="line.843"></a>
-<span class="sourceLineNo">844</span>                          .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.844"></a>
-<span class="sourceLineNo">845</span>                          .withChecksumType(ChecksumType.NULL).build();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      HFileBlock block = new HFileBlock(BlockType.DATA, size, size, -1, buf,<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          HFileBlock.FILL_HEADER, -1, 0, -1, meta);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      long byteBufferExpectedSize = ClassSize.align(ClassSize.estimateBase(<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          new MultiByteBuff(buf).getClass(), true)<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          + HConstants.HFILEBLOCK_HEADER_SIZE + size);<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      long hfileMetaSize =  ClassSize.align(ClassSize.estimateBase(HFileContext.class, true));<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      long hfileBlockExpectedSize =<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          ClassSize.align(ClassSize.estimateBase(HFileBlock.class, true));<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      long expected = hfileBlockExpectedSize + byteBufferExpectedSize + hfileMetaSize;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      assertEquals("Block data size: " + size + ", byte buffer expected " +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>          "size: " + byteBufferExpectedSize + ", HFileBlock class expected " +<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          "size: " + hfileBlockExpectedSize + ";", expected,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          block.heapSize());<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    }<a name="line.859"></a>
-<span class="sourceLineNo">860</span>  }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>  @Test<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  public void testSerializeWithoutNextBlockMetadata() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    int size = 100;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    int length = HConstants.HFILEBLOCK_HEADER_SIZE + size;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    byte[] byteArr = new byte[length];<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    ByteBuffer buf = ByteBuffer.wrap(byteArr, 0, size);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    HFileContext meta = new HFileContextBuilder().build();<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    HFileBlock blockWithNextBlockMetadata = new HFileBlock(BlockType.DATA, size, size, -1, buf,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        HFileBlock.FILL_HEADER, -1, 52, -1, meta);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    HFileBlock blockWithoutNextBlockMetadata = new HFileBlock(BlockType.DATA, size, size, -1, buf,<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        HFileBlock.FILL_HEADER, -1, -1, -1, meta);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    ByteBuffer buff1 = ByteBuffer.allocate(length);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>    ByteBuffer buff2 = ByteBuffer.allocate(length);<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    blockWithNextBlockMetadata.serialize(buff1, true);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    blockWithoutNextBlockMetadata.serialize(buff2, true);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    assertNotEquals(buff1, buff2);<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    buff1.clear();<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    buff2.clear();<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    blockWithNextBlockMetadata.serialize(buff1, false);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    blockWithoutNextBlockMetadata.serialize(buff2, false);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    assertEquals(buff1, buff2);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>  }<a name="line.883"></a>
-<span class="sourceLineNo">884</span>}<a name="line.884"></a>
+<span class="sourceLineNo">379</span>          LOG.info("testDataBlockEncoding: Compression algorithm={}, pread={}, dataBlockEncoder={}",<a name="line.379"></a>
+<span class="sourceLineNo">380</span>              algo.toString(), pread, encoding);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "blocks_v2_"<a name="line.381"></a>
+<span class="sourceLineNo">382</span>              + algo + "_" + encoding.toString());<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          FSDataOutputStream os = fs.create(path);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          HFileDataBlockEncoder dataBlockEncoder = (encoding != DataBlockEncoding.NONE) ?<a name="line.384"></a>
+<span class="sourceLineNo">385</span>              new HFileDataBlockEncoderImpl(encoding) : NoOpDataBlockEncoder.INSTANCE;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>          HFileContext meta = new HFileContextBuilder()<a name="line.386"></a>
+<span class="sourceLineNo">387</span>                              .withCompression(algo)<a name="line.387"></a>
+<span class="sourceLineNo">388</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.388"></a>
+<span class="sourceLineNo">389</span>                              .withIncludesTags(includesTag)<a name="line.389"></a>
+<span class="sourceLineNo">390</span>                              .withBytesPerCheckSum(HFile.DEFAULT_BYTES_PER_CHECKSUM)<a name="line.390"></a>
+<span class="sourceLineNo">391</span>                              .build();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          HFileBlock.Writer hbw = new HFileBlock.Writer(dataBlockEncoder, meta);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          long totalSize = 0;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          final List&lt;Integer&gt; encodedSizes = new ArrayList&lt;&gt;();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          final List&lt;ByteBuffer&gt; encodedBlocks = new ArrayList&lt;&gt;();<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            hbw.startWriting(BlockType.DATA);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            writeTestKeyValues(hbw, blockId, includesMemstoreTS, includesTag);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>            hbw.writeHeaderAndData(os);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            int headerLen = HConstants.HFILEBLOCK_HEADER_SIZE;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            byte[] encodedResultWithHeader = hbw.cloneUncompressedBufferWithHeader().array();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            final int encodedSize = encodedResultWithHeader.length - headerLen;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>              // We need to account for the two-byte encoding algorithm ID that<a name="line.404"></a>
+<span class="sourceLineNo">405</span>              // comes after the 24-byte block header but before encoded KVs.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>              headerLen += DataBlockEncoding.ID_SIZE;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>            }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            byte[] encodedDataSection =<a name="line.408"></a>
+<span class="sourceLineNo">409</span>                new byte[encodedResultWithHeader.length - headerLen];<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            System.arraycopy(encodedResultWithHeader, headerLen,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>                encodedDataSection, 0, encodedDataSection.length);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            final ByteBuffer encodedBuf =<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                ByteBuffer.wrap(encodedDataSection);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            encodedSizes.add(encodedSize);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            encodedBlocks.add(encodedBuf);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>            totalSize += hbw.getOnDiskSizeWithHeader();<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          os.close();<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>          FSDataInputStream is = fs.open(path);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          meta = new HFileContextBuilder()<a name="line.421"></a>
+<span class="sourceLineNo">422</span>                .withHBaseCheckSum(true)<a name="line.422"></a>
+<span class="sourceLineNo">423</span>                .withCompression(algo)<a name="line.423"></a>
+<span class="sourceLineNo">424</span>                .withIncludesMvcc(includesMemstoreTS)<a name="line.424"></a>
+<span class="sourceLineNo">425</span>                .withIncludesTags(includesTag)<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                .build();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          HFileBlock.FSReaderImpl hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          hbr.setDataBlockEncoder(dataBlockEncoder);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          hbr.setIncludesMemStoreTS(includesMemstoreTS);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          HFileBlock blockFromHFile, blockUnpacked;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          int pos = 0;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          for (int blockId = 0; blockId &lt; numBlocks; ++blockId) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            blockFromHFile = hbr.readBlockData(pos, -1, pread, false);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>            blockFromHFile.sanityCheck();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            pos += blockFromHFile.getOnDiskSizeWithHeader();<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            assertEquals((int) encodedSizes.get(blockId),<a name="line.437"></a>
+<span class="sourceLineNo">438</span>              blockFromHFile.getUncompressedSizeWithoutHeader());<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            assertEquals(meta.isCompressedOrEncrypted(), !blockFromHFile.isUnpacked());<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            long packedHeapsize = blockFromHFile.heapSize();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>            blockUnpacked = blockFromHFile.unpack(meta, hbr);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>            assertTrue(blockUnpacked.isUnpacked());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>            if (meta.isCompressedOrEncrypted()) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>              LOG.info("packedHeapsize=" + packedHeapsize + ", unpackedHeadsize=" + blockUnpacked<a name="line.444"></a>
+<span class="sourceLineNo">445</span>                .heapSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span>              assertFalse(packedHeapsize == blockUnpacked.heapSize());<a name="line.446"></a>
+<span class="sourceLineNo">447</span>              assertTrue("Packed heapSize should be &lt; unpacked heapSize",<a name="line.447"></a>
+<span class="sourceLineNo">448</span>                packedHeapsize &lt; blockUnpacked.heapSize());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            }<a name="line.449"></a>
+<span class="sourceLineNo">450</span>            ByteBuff actualBuffer = blockUnpacked.getBufferWithoutHeader();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            if (encoding != DataBlockEncoding.NONE) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>              // We expect a two-byte big-endian encoding id.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>              assertEquals(<a name="line.453"></a>
+<span class="sourceLineNo">454</span>                "Unexpected first byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                Long.toHexString(0), Long.toHexString(actualBuffer.get(0)));<a name="line.455"></a>
+<span class="sourceLineNo">456</span>              assertEquals(<a name="line.456"></a>
+<span class="sourceLineNo">457</span>                "Unexpected second byte with " + buildMessageDetails(algo, encoding, pread),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>                Long.toHexString(encoding.getId()), Long.toHexString(actualBuffer.get(1)));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>              actualBuffer.position(2);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>              actualBuffer = actualBuffer.slice();<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>            ByteBuffer expectedBuffer = encodedBlocks.get(blockId);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            expectedBuffer.rewind();<a name="line.464"></a>
+<span class="sourceLineNo">465</span><a name="line.465"></a>
+<span class="sourceLineNo">466</span>            // test if content matches, produce nice message<a name="line.466"></a>
+<span class="sourceLineNo">467</span>            assertBuffersEqual(new SingleByteBuff(expectedBuffer), actualBuffer, algo, encoding,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>                pread);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>            // test serialized blocks<a name="line.470"></a>
+<span class="sourceLineNo">471</span>            for (boolean reuseBuffer : new boolean[] { false, true }) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>              ByteBuffer serialized = ByteBuffer.allocate(blockFromHFile.getSerializedLength());<a name="line.472"></a>
+<span class="sourceLineNo">473</span>              blockFromHFile.serialize(serialized, true);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>              HFileBlock deserialized =<a name="line.474"></a>
+<span class="sourceLineNo">475</span>                  (HFileBlock) blockFromHFile.getDeserializer().deserialize(<a name="line.475"></a>
+<span class="sourceLineNo">476</span>                    new SingleByteBuff(serialized), reuseBuffer, MemoryType.EXCLUSIVE);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>              assertEquals(<a name="line.477"></a>
+<span class="sourceLineNo">478</span>                "Serialization did not preserve block state. reuseBuffer=" + reuseBuffer,<a name="line.478"></a>
+<span class="sourceLineNo">479</span>                blockFromHFile, deserialized);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>              // intentional reference comparison<a name="line.480"></a>
+<span class="sourceLineNo">481</span>              if (blockFromHFile != blockUnpacked) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>                assertEquals("Deserializaed block cannot be unpacked correctly.",<a name="line.482"></a>
+<span class="sourceLineNo">483</span>                  blockUnpacked, deserialized.unpack(meta, hbr));<a name="line.483"></a>
+<span class="sourceLineNo">484</span>              }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            }<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>          is.close();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<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>  static String buildMessageDetails(Algorithm compression, DataBlockEncoding encoding,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      boolean pread) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return String.format("compression %s, encoding %s, pread %s", compression, encoding, pread);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  static void assertBuffersEqual(ByteBuff expectedBuffer,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      ByteBuff actualBuffer, Compression.Algorithm compression,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      DataBlockEncoding encoding, boolean pread) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    if (!actualBuffer.equals(expectedBuffer)) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      int prefix = 0;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      int minLimit = Math.min(expectedBuffer.limit(), actualBuffer.limit());<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      while (prefix &lt; minLimit &amp;&amp;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          expectedBuffer.get(prefix) == actualBuffer.get(prefix)) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        prefix++;<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>      fail(String.format(<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          "Content mismatch for %s, commonPrefix %d, expected %s, got %s",<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          buildMessageDetails(compression, encoding, pread), prefix,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          nextBytesToStr(expectedBuffer, prefix),<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          nextBytesToStr(actualBuffer, prefix)));<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>  /**<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * Convert a few next bytes in the given buffer at the given position to<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * string. Used for error messages.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   */<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private static String nextBytesToStr(ByteBuff buf, int pos) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    int maxBytes = buf.limit() - pos;<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    int numBytes = Math.min(16, maxBytes);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    return Bytes.toStringBinary(buf.array(), buf.arrayOffset() + pos,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>        numBytes) + (numBytes &lt; maxBytes ? "..." : "");<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>  @Test<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  public void testPreviousOffset() throws IOException {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    testPreviousOffsetInternals();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>  protected void testPreviousOffsetInternals() throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    // TODO: parameterize these nested loops.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    for (Compression.Algorithm algo : COMPRESSION_ALGORITHMS) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      for (boolean pread : BOOLEAN_VALUES) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        for (boolean cacheOnWrite : BOOLEAN_VALUES) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          Random rand = defaultRandom();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          LOG.info("testPreviousOffset: Compression algorithm={}, pread={}, cacheOnWrite={}",<a name="line.539"></a>
+<span class="sourceLineNo">540</span>              algo.toString(), pread, cacheOnWrite);<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Path path = new Path(TEST_UTIL.getDataTestDir(), "prev_offset");<a name="line.541"></a>
+<span class="sourceLineNo">542</span>          List&lt;Long&gt; expectedOffsets = new ArrayList&lt;&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          List&lt;Long&gt; expectedPrevOffsets = new ArrayList&lt;&gt;();<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          List&lt;BlockType&gt; expectedTypes = new ArrayList&lt;&gt;();<a name="line.544"></a>
+<span class="sourceLineNo">545</span>          List&lt;ByteBuffer&gt; expectedContents = cacheOnWrite ? new ArrayList&lt;&gt;() : null;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>          long totalSize = writeBlocks(rand, algo, path, expectedOffsets,<a name="line.546"></a>
+<span class="sourceLineNo">547</span>              expectedPrevOffsets, expectedTypes, expectedContents);<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>          FSDataInputStream is = fs.open(path);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>          HFileContext meta = new HFileContextBuilder()<a name="line.550"></a>
+<span class="sourceLineNo">551</span>                              .withHBaseCheckSum(true)<a name="line.551"></a>
+<span class="sourceLineNo">552</span>                              .withIncludesMvcc(includesMemstoreTS)<a name="line.552"></a>
+<span class="sourceLineNo">553</span>                              .withIncludesTags(includesTag)<a name="line.553"></a>
+<span class="sourceLineNo">554</span>                              .withCompression(algo).build();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>          HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(is, totalSize, meta);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          long curOffset = 0;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>          for (int i = 0; i &lt; NUM_TEST_BLOCKS; ++i) {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>            if (!pread) {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>              assertEquals(is.getPos(), curOffset + (i == 0 ? 0 :<a name="line.559"></a>
+<span class="sourceLineNo">560</span>                HConstants.HFILEBLOCK_HEADER_SIZE));<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>            assertEquals(expectedOffsets.get(i).longValue(), curOffset);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>            if (detailedLogging) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>              LOG.info("Reading block #" + i + " at offset " + curOffset);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>            HFileBlock b = hbr.readBlockData(curOffset, -1, pread, false);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>            if (detailedLogging) {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>              LOG.info("Block #" + i + ": " + b);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>            }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>            assertEquals("Invalid block #" + i + "'s type:",<a name="line.571"></a>
+<span class="sourceLineNo">572</span>                expectedTypes.get(i), b.getBlockType());<a name="line.572"></a>
+<span class="sourceLineNo">573</span>            assertEquals("Invalid previous block offset for block " + i<a name="line.573"></a>
+<span class="sourceLineNo">574</span>                + " of " + "type " + b.getBlockType() + ":",<a name="line.574"></a>
+<span class="sourceLineNo">575</span>                (long) expectedPrevOffsets.get(i), b.getPrevBlockOffset());<a name="line.575"></a>
+<span class="sourceLineNo">576</span>            b.sanityCheck();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>            assertEquals(curOffset, b.getOffset());<a name="line.577"></a>
+<span class="sourceLineNo">578</span><a name="line.578"></a>
+<span class="sourceLineNo">579</span>            // Now re-load this block knowing the on-disk size. This tests a<a name="line.579"></a>
+<span class="sourceLineNo">580</span>            // different branch in the loader.<a name="line.580"></a>
+<span class="sourceLineNo">581</span>            HFileBlock b2 = hbr.readBlockData(curOffset, b.getOnDiskSizeWithHeader(), pread, false);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>            b2.sanityCheck();<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>            assertEquals(b.getBlockType(), b2.getBlockType());<a name="line.584"></a>
+<span class="sourceLineNo">585</span>            assertEquals(b.getOnDiskSizeWithoutHeader(),<a name="line.585"></a>
+<span class="sourceLineNo">586</span>                b2.getOnDiskSizeWithoutHeader());<a name="line.586"></a>
+<span class="sourceLineNo">587</span>            assertEquals(b.getOnDiskSizeWithHeader(),<a name="line.587"></a>
+<span class="sourceLineNo">588</span>                b2.getOnDiskSizeWithHeader());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>            assertEquals(b.getUncompressedSizeWithoutHeader(),<a name="line.589"></a>
+<span class="sourceLineNo">590</span>                b2.getUncompressedSizeWithoutHeader());<a name="line.590"></a>
+<span class="sourceLineNo">591</span>            assertEquals(b.getPrevBlockOffset(), b2.getPrevBlockOffset());<a name="line.591"></a>
+<span class="sourceLineNo">592</span>            assertEquals(curOffset, b2.getOffset());<a name="line.592"></a>
+<span class="sourceLineNo">593</span>            assertEquals(b.getBytesPerChecksum(), b2.getBytesPerChecksum());<a name="line.593"></a>
+<span class="sourceLineNo">594</span>            assertEquals(b.getOnDiskDataSizeWithHeader(),<a name="line.594"></a>
+<span class="sourceLineNo">595</span>                         b2.getOnDiskDataSizeWithHeader());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>            assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.596"></a>
+<span class="sourceLineNo">597</span><a name="line.597"></a>
+<span class="sourceLineNo">598</span>            curOffset += b.getOnDiskSizeWithHeader();<a name="line.598"></a>
+<span class="sourceLineNo">599</span><a name="line.599"></a>
+<span class="sourceLineNo">600</span>            if (cacheOnWrite) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>              // NOTE: cache-on-write testing doesn't actually involve a BlockCache. It simply<a name="line.601"></a>
+<span class="sourceLineNo">602</span>              // verifies that the unpacked value read back off disk matches the unpacked value<a name="line.602"></a>
+<span class="sourceLineNo">603</span>              // generated before writing to disk.<a name="line.603"></a>
+<span class="sourceLineNo">604</span>              b = b.unpack(meta, hbr);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>              // b's buffer has header + data + checksum while<a name="line.605"></a>
+<span class="sourceLineNo">606</span>              // expectedContents have header + data only<a name="line.606"></a>
+<span class="sourceLineNo">607</span>              ByteBuff bufRead = b.getBufferReadOnly();<a name="line.607"></a>
+<span class="sourceLineNo">608</span>              ByteBuffer bufExpected = expectedContents.get(i);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>              boolean bytesAreCorrect = Bytes.compareTo(bufRead.array(),<a name="line.609"></a>
+<span class="sourceLineNo">610</span>                  bufRead.arrayOffset(),<a name="line.610"></a>
+<span class="sourceLineNo">611</span>                  bufRead.limit() - b.totalChecksumBytes(),<a name="line.611"></a>
+<span class="sourceLineNo">612</span>                  bufExpected.array(), bufExpected.arrayOffset(),<a name="line.612"></a>
+<span class="sourceLineNo">613</span>                  bufExpected.limit()) == 0;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>              String wrongBytesMsg = "";<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>              if (!bytesAreCorrect) {<a name="line.616"></a>
+<span class="sourceLineNo">617</span>                // Optimization: only construct an error message in case we<a name="line.617"></a>
+<span class="sourceLineNo">618</span>                // will need it.<a name="line.618"></a>
+<span class="sourceLineNo">619</span>                wrongBytesMsg = "Expected bytes in block #" + i + " (algo="<a name="line.619"></a>
+<span class="sourceLineNo">620</span>                    + algo + ", pread=" + pread<a name="line.620"></a>
+<span class="sourceLineNo">621</span>                    + ", cacheOnWrite=" + cacheOnWrite + "):\n";<a name="line.621"></a>
+<span class="sourceLineNo">622</span>                wrongBytesMsg += Bytes.toStringBinary(bufExpected.array(),<a name="line.622"></a>
+<span class="sourceLineNo">623</span>                  bufExpected.arrayOffset(), Math.min(32 + 10, bufExpected.limit()))<a name="line.623"></a>
+<span class="sourceLineNo">624</span>                    + ", actual:\n"<a name="line.624"></a>
+<span class="sourceLineNo">625</span>                    + Bytes.toStringBinary(bufRead.array(),<a name="line.625"></a>
+<span class="sourceLineNo">626</span>                  bufRead.arrayOffset(), Math.min(32 + 10, bufRead.limit()));<a name="line.626"></a>
+<span class="sourceLineNo">627</span>                if (detailedLogging) {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>                  LOG.warn("expected header" +<a name="line.628"></a>
+<span class="sourceLineNo">629</span>                           HFileBlock.toStringHeader(new SingleByteBuff(bufExpected)) +<a name="line.629"></a>
+<span class="sourceLineNo">630</span>                           "\nfound    header" +<a name="line.630"></a>
+<span class="sourceLineNo">631</span>                           HFileBlock.toStringHeader(bufRead));<a name="line.631"></a>
+<span class="sourceLineNo">632</span>                  LOG.warn("bufread offset " + bufRead.arrayOffset() +<a name="line.632"></a>
+<span class="sourceLineNo">633</span>                           " limit " + bufRead.limit() +<a name="line.633"></a>
+<span class="sourceLineNo">634</span>                           " expected offset " + bufExpected.arrayOffset() +<a name="line.634"></a>
+<span class="sourceLineNo">635</span>                           " limit " + bufExpected.limit());<a name="line.635"></a>
+<span class="sourceLineNo">636</span>                  LOG.warn(wrongBytesMsg);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>                }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>              }<a name="line.638"></a>
+<span class="sourceLineNo">639</span>              assertTrue(wrongBytesMsg, bytesAreCorrect);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>            }<a name="line.640"></a>
+<span class="sourceLineNo">641</span>          }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>          assertEquals(curOffset, fs.getFileStatus(path).getLen());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>          is.close();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>        }<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      }<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><a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private Random defaultRandom() {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    return new Random(189237);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
+<span class="sourceLineNo">653</span><a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private class BlockReaderThread implements Callable&lt;Boolean&gt; {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    private final String clientId;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    private final HFileBlock.FSReader hbr;<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    private final List&lt;Long&gt; offsets;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    private final List&lt;BlockType&gt; types;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    private final long fileSize;<a name="line.659"></a>
+<span class="sourceLineNo">660</span><a name="line.660"></a>
+<span class="sourceLineNo">661</span>    public BlockReaderThread(String clientId,<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        HFileBlock.FSReader hbr, List&lt;Long&gt; offsets, List&lt;BlockType&gt; types,<a name="line.662"></a>
+<span class="sourceLineNo">663</span>        long fileSize) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      this.clientId = clientId;<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      this.offsets = offsets;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      this.hbr = hbr;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      this.types = types;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      this.fileSize = fileSize;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    @Override<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    public Boolean call() throws Exception {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      Random rand = new Random(clientId.hashCode());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      long endTime = System.currentTimeMillis() + 10000;<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      int numBlocksRead = 0;<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      int numPositionalRead = 0;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      int numWithOnDiskSize = 0;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      while (System.currentTimeMillis() &lt; endTime) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        int blockId = rand.nextInt(NUM_TEST_BLOCKS);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>        long offset = offsets.get(blockId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>        // now we only support concurrent read with pread = true<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        boolean pread = true;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        boolean withOnDiskSize = rand.nextBoolean();<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        long expectedSize =<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          (blockId == NUM_TEST_BLOCKS - 1 ? fileSize<a name="line.685"></a>
+<span class="sourceLineNo">686</span>              : offsets.get(blockId + 1)) - offset;<a name="line.686"></a>
+<span class="sourceLineNo">687</span><a name="line.687"></a>
+<span class="sourceLineNo">688</span>        HFileBlock b;<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        try {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>          long onDiskSizeArg = withOnDiskSize ? expectedSize : -1;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          b = hbr.readBlockData(offset, onDiskSizeArg, pread, false);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>        } catch (IOException ex) {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>          LOG.error("Error in client " + clientId + " trying to read block at "<a name="line.693"></a>
+<span class="sourceLineNo">694</span>              + offset + ", pread=" + pread + ", withOnDiskSize=" +<a name="line.694"></a>
+<span class="sourceLineNo">695</span>              withOnDiskSize, ex);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          return false;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>        assertEquals(types.get(blockId), b.getBlockType());<a name="line.699"></a

<TRUNCATED>

[20/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
index c2698b3..9142fe1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
@@ -207,307 +207,309 @@
 <span class="sourceLineNo">199</span>      }<a name="line.199"></a>
 <span class="sourceLineNo">200</span>      tmp = fileInfo.get(TIMERANGE_KEY);<a name="line.200"></a>
 <span class="sourceLineNo">201</span>      fd.latestPutTs = tmp == null ? HConstants.LATEST_TIMESTAMP: TimeRangeTracker.parseFrom(tmp).getMax();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, encoding={}, seqNum={}{}",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          keyCount,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          r.getBloomFilterType().toString(),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.207"></a>
-<span class="sourceLineNo">208</span>          seqNum,<a name="line.208"></a>
-<span class="sourceLineNo">209</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    return fd;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * Creates file scanners for compaction.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param filesToCompact Files.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @return Scanners.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      smallestReadPoint);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private long getSmallestReadPoint() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return store.getSmallestReadPoint();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  protected interface InternalScannerFactory {<a name="line.229"></a>
+<span class="sourceLineNo">202</span>      LOG.debug("Compacting {}, keycount={}, bloomtype={}, size={}, "<a name="line.202"></a>
+<span class="sourceLineNo">203</span>              + "encoding={}, compression={}, seqNum={}{}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          (file.getPath() == null? null: file.getPath().getName()),<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          keyCount,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          r.getBloomFilterType().toString(),<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          TraditionalBinaryPrefix.long2String(r.length(), "", 1),<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          r.getHFileReader().getDataBlockEncoding(),<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          compactionCompression,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          seqNum,<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          (allFiles? ", earliestPutTs=" + earliestPutTs: ""));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return fd;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * Creates file scanners for compaction.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @param filesToCompact Files.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return Scanners.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  private List&lt;StoreFileScanner&gt; createFileScanners(Collection&lt;HStoreFile&gt; filesToCompact,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      long smallestReadPoint, boolean useDropBehind) throws IOException {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    return StoreFileScanner.getScannersForCompaction(filesToCompact, useDropBehind,<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      smallestReadPoint);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private long getSmallestReadPoint() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    return store.getSmallestReadPoint();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
 <span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.231"></a>
+<span class="sourceLineNo">231</span>  protected interface InternalScannerFactory {<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.237"></a>
+<span class="sourceLineNo">233</span>    ScanType getScanType(CompactionRequestImpl request);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners, ScanType scanType,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        FileDetails fd, long smallestReadPoint) throws IOException;<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>    @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        fd.earliestPutTs);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  };<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Creates a writer for a new file in a temporary directory.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param fd The file details.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @throws IOException if creation failed<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      User user) throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    if (store.getCoprocessorHost() == null) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return store.getScanInfo();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      request, user);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  /**<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param request Compaction request.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param scanType Scan type.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param scanner The default scanner created for compaction.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InternalScanner scanner, User user) throws IOException {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    if (store.getCoprocessorHost() == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      return scanner;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      request, user);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>    // Find the smallest read point across all the Scanners.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>    T writer = null;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    boolean dropCache;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      dropCache = this.dropCacheMajor;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMinor;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    List&lt;StoreFileScanner&gt; scanners =<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    InternalScanner scanner = null;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    boolean finished = false;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      boolean cleanSeqId = false;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        cleanSeqId = true;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      if (!finished) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    } finally {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Closeables.close(scanner, true);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (!finished &amp;&amp; writer != null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        abortWriter(writer);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    assert finished : "We should have exited the method on all error paths";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return commitWriter(writer, fd, request);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      CompactionRequestImpl request) throws IOException;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.345"></a>
+<span class="sourceLineNo">239</span>  protected final InternalScannerFactory defaultScannerFactory = new InternalScannerFactory() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>    @Override<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public ScanType getScanType(CompactionRequestImpl request) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      return request.isAllFiles() ? COMPACT_DROP_DELETES : COMPACT_RETAIN_DELETES;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    @Override<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    public InternalScanner createScanner(ScanInfo scanInfo, List&lt;StoreFileScanner&gt; scanners,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        ScanType scanType, FileDetails fd, long smallestReadPoint) throws IOException {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return Compactor.this.createScanner(store, scanInfo, scanners, scanType, smallestReadPoint,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        fd.earliestPutTs);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  };<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>  /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * Creates a writer for a new file in a temporary directory.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @param fd The file details.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @return Writer for a new StoreFile in the tmp dir.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @throws IOException if creation failed<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  protected final StoreFileWriter createTmpWriter(FileDetails fd, boolean shouldDropBehind)<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throws IOException {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // When all MVCC readpoints are 0, don't write them.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // See HBASE-8166, HBASE-12600, and HBASE-13389.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    return store.createWriterInTmp(fd.maxKeyCount, this.compactionCompression, true,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    fd.maxMVCCReadpoint &gt; 0, fd.maxTagsLength &gt; 0, shouldDropBehind);<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>  private ScanInfo preCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      User user) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    if (store.getCoprocessorHost() == null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      return store.getScanInfo();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    return store.getCoprocessorHost().preCompactScannerOpen(store, scanType, request.getTracker(),<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      request, user);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  }<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>  /**<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * Calls coprocessor, if any, to create scanners - after normal scanner creation.<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param request Compaction request.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param scanType Scan type.<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @param scanner The default scanner created for compaction.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @return Scanner scanner to use (usually the default); null if compaction should not proceed.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  private InternalScanner postCompactScannerOpen(CompactionRequestImpl request, ScanType scanType,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      InternalScanner scanner, User user) throws IOException {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    if (store.getCoprocessorHost() == null) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      return scanner;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return store.getCoprocessorHost().preCompact(store, scanner, scanType, request.getTracker(),<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      request, user);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected final List&lt;Path&gt; compact(final CompactionRequestImpl request,<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      InternalScannerFactory scannerFactory, CellSinkFactory&lt;T&gt; sinkFactory,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      ThroughputController throughputController, User user) throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    FileDetails fd = getFileDetails(request.getFiles(), request.isAllFiles());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    this.progress = new CompactionProgress(fd.maxKeyCount);<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    // Find the smallest read point across all the Scanners.<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    long smallestReadPoint = getSmallestReadPoint();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>    T writer = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    boolean dropCache;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (request.isMajor() || request.isAllFiles()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      dropCache = this.dropCacheMajor;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      dropCache = this.dropCacheMinor;<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>    List&lt;StoreFileScanner&gt; scanners =<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        createFileScanners(request.getFiles(), smallestReadPoint, dropCache);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    InternalScanner scanner = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    boolean finished = false;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      /* Include deletes, unless we are doing a major compaction */<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      ScanType scanType = scannerFactory.getScanType(request);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      ScanInfo scanInfo = preCompactScannerOpen(request, scanType, user);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      scanner = postCompactScannerOpen(request, scanType,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        scannerFactory.createScanner(scanInfo, scanners, scanType, fd, smallestReadPoint), user);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      boolean cleanSeqId = false;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (fd.minSeqIdToKeep &gt; 0 &amp;&amp; !store.getColumnFamilyDescriptor().isNewVersionBehavior()) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        // For mvcc-sensitive family, we never set mvcc to 0.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        cleanSeqId = true;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      writer = sinkFactory.createWriter(scanner, fd, dropCache);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      finished = performCompaction(fd, scanner, writer, smallestReadPoint, cleanSeqId,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        throughputController, request.isAllFiles(), request.getFiles().size());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (!finished) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        throw new InterruptedIOException("Aborting compaction of store " + store + " in region "<a name="line.330"></a>
+<span class="sourceLineNo">331</span>            + store.getRegionInfo().getRegionNameAsString() + " because it was interrupted.");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    } finally {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      Closeables.close(scanner, true);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      if (!finished &amp;&amp; writer != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        abortWriter(writer);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    assert finished : "We should have exited the method on all error paths";<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    assert writer != null : "Writer should be non-null if no error";<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return commitWriter(writer, fd, request);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  protected abstract List&lt;Path&gt; commitWriter(T writer, FileDetails fd,<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      CompactionRequestImpl request) throws IOException;<a name="line.345"></a>
 <span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Performs the compaction.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * @param fd FileDetails of cell sink writer<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param scanner Where to read from.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param writer Where to write to.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param smallestReadPoint Smallest read point.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *          smallestReadPoint<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param major Is a major compaction.<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @param numofFilesToCompact the number of files to compact<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    assert writer instanceof ShipperListener;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    long bytesWrittenProgressForLog = 0;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // we have to use a do/while loop.<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    long lastMillis = 0;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (LOG.isDebugEnabled()) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    long now = 0;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    boolean hasMore;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    ScannerContext scannerContext =<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>    throughputController.start(compactionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      do {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        if (LOG.isDebugEnabled()) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // output to writer:<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        Cell lastCleanCell = null;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        long lastCleanCellSeqId = 0;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        for (Cell c : cells) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            lastCleanCell = c;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          } else {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            lastCleanCell = null;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            lastCleanCellSeqId = 0;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          writer.append(c);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          int len = KeyValueUtil.length(c);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          ++progress.currentCompactedKVs;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          progress.totalCompactedSize += len;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          bytesWrittenProgressForShippedCall += len;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          if (LOG.isDebugEnabled()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            bytesWrittenProgressForLog += len;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          throughputController.control(compactionName, len);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          // check periodically to see if a system stop is requested<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>              if (!store.areWritesEnabled()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                progress.cancel();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                return false;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>              }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            if (lastCleanCell != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.423"></a>
-<span class="sourceLineNo">424</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.424"></a>
-<span class="sourceLineNo">425</span>              // sequence id before ShipperListener.beforeShipped<a name="line.425"></a>
-<span class="sourceLineNo">426</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>            }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>            // if they are holding any.<a name="line.429"></a>
-<span class="sourceLineNo">430</span>            ((ShipperListener)writer).beforeShipped();<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.432"></a>
-<span class="sourceLineNo">433</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.434"></a>
-<span class="sourceLineNo">435</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.435"></a>
-<span class="sourceLineNo">436</span>            // may clear prevBlocks list.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>            kvs.shipped();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        // Log the progress of long running compactions every minute if<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        // logging at DEBUG level<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        if (LOG.isDebugEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug("Compaction progress: "<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                + compactionName<a name="line.450"></a>
-<span class="sourceLineNo">451</span>                + " "<a name="line.451"></a>
-<span class="sourceLineNo">452</span>                + progress<a name="line.452"></a>
-<span class="sourceLineNo">453</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.454"></a>
-<span class="sourceLineNo">455</span>                + throughputController);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            lastMillis = now;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } while (hasMore);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    } catch (InterruptedException e) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      progress.cancel();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          + compactionName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    } finally {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      throughputController.finish(compactionName);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    progress.complete();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return true;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  /**<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * @param store store<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * @param scanners Store file scanners.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * @param scanType Scan type.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param earliestPutTs Earliest put across all files.<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return A compaction scanner.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      long earliestPutTs) throws IOException {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>  /**<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @param store The store.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * @param scanners Store file scanners.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * @param earliestPutTs Earliest put across all files.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @return A compaction scanner.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        dropDeletesFromRow, dropDeletesToRow);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>}<a name="line.502"></a>
+<span class="sourceLineNo">347</span>  protected abstract void abortWriter(T writer) throws IOException;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Performs the compaction.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * @param fd FileDetails of cell sink writer<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   * @param scanner Where to read from.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>   * @param writer Where to write to.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>   * @param smallestReadPoint Smallest read point.<a name="line.354"></a>
+<span class="sourceLineNo">355</span>   * @param cleanSeqId When true, remove seqId(used to be mvcc) value which is &amp;lt;=<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   *          smallestReadPoint<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @param major Is a major compaction.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param numofFilesToCompact the number of files to compact<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @return Whether compaction ended; false if it was interrupted for some reason.<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  protected boolean performCompaction(FileDetails fd, InternalScanner scanner, CellSink writer,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      long smallestReadPoint, boolean cleanSeqId, ThroughputController throughputController,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      boolean major, int numofFilesToCompact) throws IOException {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    assert writer instanceof ShipperListener;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    long bytesWrittenProgressForCloseCheck = 0;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    long bytesWrittenProgressForLog = 0;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    long bytesWrittenProgressForShippedCall = 0;<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    // Since scanner.next() can return 'false' but still be delivering data,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    // we have to use a do/while loop.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    long closeCheckSizeLimit = HStore.getCloseCheckInterval();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    long lastMillis = 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (LOG.isDebugEnabled()) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      lastMillis = EnvironmentEdgeManager.currentTime();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    String compactionName = ThroughputControlUtil.getNameForThrottling(store, "compaction");<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    long now = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    boolean hasMore;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    ScannerContext scannerContext =<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        ScannerContext.newBuilder().setBatchLimit(compactionKVMax).build();<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>    throughputController.start(compactionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    KeyValueScanner kvs = (scanner instanceof KeyValueScanner)? (KeyValueScanner)scanner : null;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    long shippedCallSizeLimit = (long) numofFilesToCompact * this.store.getColumnFamilyDescriptor().getBlocksize();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    try {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      do {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        hasMore = scanner.next(cells, scannerContext);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        if (LOG.isDebugEnabled()) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          now = EnvironmentEdgeManager.currentTime();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        // output to writer:<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        Cell lastCleanCell = null;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        long lastCleanCellSeqId = 0;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        for (Cell c : cells) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          if (cleanSeqId &amp;&amp; c.getSequenceId() &lt;= smallestReadPoint) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>            lastCleanCell = c;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            lastCleanCellSeqId = c.getSequenceId();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            PrivateCellUtil.setSequenceId(c, 0);<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          } else {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            lastCleanCell = null;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            lastCleanCellSeqId = 0;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          writer.append(c);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          int len = KeyValueUtil.length(c);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          ++progress.currentCompactedKVs;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          progress.totalCompactedSize += len;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          bytesWrittenProgressForShippedCall += len;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          if (LOG.isDebugEnabled()) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>            bytesWrittenProgressForLog += len;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          throughputController.control(compactionName, len);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          // check periodically to see if a system stop is requested<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          if (closeCheckSizeLimit &gt; 0) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            bytesWrittenProgressForCloseCheck += len;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>            if (bytesWrittenProgressForCloseCheck &gt; closeCheckSizeLimit) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>              bytesWrittenProgressForCloseCheck = 0;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>              if (!store.areWritesEnabled()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                progress.cancel();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                return false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>              }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          if (kvs != null &amp;&amp; bytesWrittenProgressForShippedCall &gt; shippedCallSizeLimit) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>            if (lastCleanCell != null) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>              // ShipperListener will do a clone of the last cells it refer, so need to set back<a name="line.426"></a>
+<span class="sourceLineNo">427</span>              // sequence id before ShipperListener.beforeShipped<a name="line.427"></a>
+<span class="sourceLineNo">428</span>              PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            // Clone the cells that are in the writer so that they are freed of references,<a name="line.430"></a>
+<span class="sourceLineNo">431</span>            // if they are holding any.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>            ((ShipperListener)writer).beforeShipped();<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            // The SHARED block references, being read for compaction, will be kept in prevBlocks<a name="line.433"></a>
+<span class="sourceLineNo">434</span>            // list(See HFileScannerImpl#prevBlocks). In case of scan flow, after each set of cells<a name="line.434"></a>
+<span class="sourceLineNo">435</span>            // being returned to client, we will call shipped() which can clear this list. Here by<a name="line.435"></a>
+<span class="sourceLineNo">436</span>            // we are doing the similar thing. In between the compaction (after every N cells<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            // written with collective size of 'shippedCallSizeLimit') we will call shipped which<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            // may clear prevBlocks list.<a name="line.438"></a>
+<span class="sourceLineNo">439</span>            kvs.shipped();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            bytesWrittenProgressForShippedCall = 0;<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>        if (lastCleanCell != null) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          // HBASE-16931, set back sequence id to avoid affecting scan order unexpectedly<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          PrivateCellUtil.setSequenceId(lastCleanCell, lastCleanCellSeqId);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        // Log the progress of long running compactions every minute if<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        // logging at DEBUG level<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        if (LOG.isDebugEnabled()) {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          if ((now - lastMillis) &gt;= COMPACTION_PROGRESS_LOG_INTERVAL) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            LOG.debug("Compaction progress: "<a name="line.451"></a>
+<span class="sourceLineNo">452</span>                + compactionName<a name="line.452"></a>
+<span class="sourceLineNo">453</span>                + " "<a name="line.453"></a>
+<span class="sourceLineNo">454</span>                + progress<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                + String.format(", rate=%.2f kB/sec", (bytesWrittenProgressForLog / 1024.0)<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                    / ((now - lastMillis) / 1000.0)) + ", throughputController is "<a name="line.456"></a>
+<span class="sourceLineNo">457</span>                + throughputController);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            lastMillis = now;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            bytesWrittenProgressForLog = 0;<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>        cells.clear();<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      } while (hasMore);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } catch (InterruptedException e) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      progress.cancel();<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      throw new InterruptedIOException("Interrupted while control throughput of compacting "<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          + compactionName);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    } finally {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throughputController.finish(compactionName);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    progress.complete();<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    return true;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>  /**<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * @param store store<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @param scanners Store file scanners.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * @param scanType Scan type.<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @param earliestPutTs Earliest put across all files.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return A compaction scanner.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      List&lt;StoreFileScanner&gt; scanners, ScanType scanType, long smallestReadPoint,<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      long earliestPutTs) throws IOException {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return new StoreScanner(store, scanInfo, scanners, scanType, smallestReadPoint, earliestPutTs);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param store The store.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @param scanners Store file scanners.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * @param smallestReadPoint Smallest MVCC read point.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @param earliestPutTs Earliest put across all files.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * @param dropDeletesFromRow Drop deletes starting with this row, inclusive. Can be null.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   * @param dropDeletesToRow Drop deletes ending with this row, exclusive. Can be null.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   * @return A compaction scanner.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   */<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  protected InternalScanner createScanner(HStore store, ScanInfo scanInfo,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      List&lt;StoreFileScanner&gt; scanners, long smallestReadPoint, long earliestPutTs,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow) throws IOException {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    return new StoreScanner(store, scanInfo, scanners, smallestReadPoint, earliestPutTs,<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        dropDeletesFromRow, dropDeletesToRow);<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>
 
 
 


[32/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index fd5ec52..6034196 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -8953,44 +8953,62 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>
-<div class="block">HBase Canary Tool, that that can be used to do
- "canary monitoring" of a running HBase cluster.</div>
+<div class="block">HBase Canary Tool for "canary monitoring" of a running HBase cluster.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#Canary--">Canary()</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#Canary-java.util.concurrent.ExecutorService-">Canary(ExecutorService)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#Canary-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.Sink-">Canary(ExecutorService, Canary.Sink)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.Monitor</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">A Monitor super-class can be extended by users</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionMonitor</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">A monitor for region mode.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionServerMonitor</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">A monitor for regionserver mode</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionServerStdOutSink</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">By RegionServer, for 'regionserver' mode.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionServerTask</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>
-<div class="block">Get one row from a region on the regionserver and outputs the latency, or the failure.</div>
+<div class="block">Run a single RegionServer Task and then exit.</div>
 </dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionStdOutSink</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">By Region, for 'region'  mode.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionTask.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionTask</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>
-<div class="block">For each column family of the region tries to get one row and outputs the latency, or the
- failure.</div>
+<div class="block">Run a single Region Task and then exit.</div>
 </dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.RegionTask.TaskType</span></a> - Enum in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.Sink</span></a> - Interface in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">Sink interface used by the canary to output information</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.StdOutSink</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">Simple implementation of canary sink that allows plotting to a file or standard output.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.ZookeeperMonitor</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.ZookeeperStdOutSink</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">Output for 'zookeeper' mode.</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html" title="class in org.apache.hadoop.hbase.tool"><span class="typeNameLink">Canary.ZookeeperTask</span></a> - Class in <a href="org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">Run a single zookeeper Task and then exit.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#CANARY_TABLE_FAMILY_NAME">CANARY_TABLE_FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CellArrayImmutableSegment.html#canBeFlattened--">canBeFlattened()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CellArrayImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">CellArrayImmutableSegment</a></dt>
@@ -16743,9 +16761,13 @@
  the mapper how to rename column families.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#configuredReadTableTimeouts">configuredReadTableTimeouts</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">This is a Map of table to timeout.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#configuredReadTableTimeouts">configuredReadTableTimeouts</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">This is a timeout per table.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#configuredWriteTableTimeout">configuredWriteTableTimeout</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#configuredWriteTableTimeout">configuredWriteTableTimeout</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
@@ -50138,6 +50160,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.html#getSink--">getSink()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceFactoryImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#getSink-org.apache.hadoop.conf.Configuration-java.lang.Class-">getSink(Configuration, Class)</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#getSink--">getSink()</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#getSink--">getSink()</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></dt>
@@ -90889,7 +90913,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html#regionMetricsUpdateTask">regionMetricsUpdateTask</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionWrapperImpl</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor(Connection, String[], boolean, Canary.StdOutSink, ExecutorService, boolean, TableName, boolean, HashMap&lt;String, Long&gt;, long, long)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor(Connection, String[], boolean, Canary.Sink, ExecutorService, boolean, TableName, boolean, HashMap&lt;String, Long&gt;, long, long)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html#regionMoved-int-int-int-">regionMoved(int, int, int)</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a></dt>
 <dd>&nbsp;</dd>
@@ -91381,8 +91405,10 @@ service.</div>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.RegionServerMetricsWrapperRunnable.html#RegionServerMetricsWrapperRunnable--">RegionServerMetricsWrapperRunnable()</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.RegionServerMetricsWrapperRunnable.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionServerWrapperImpl.RegionServerMetricsWrapperRunnable</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#regionServerMode">regionServerMode</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor(Connection, String[], boolean, Canary.StdOutSink, ExecutorService, boolean, boolean, long)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></dt>
+<dd>
+<div class="block">True if we are to run in 'regionServer' mode.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor(Connection, String[], boolean, Canary.Sink, ExecutorService, boolean, boolean, long)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/coprocessor/RegionServerObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionServerObserver</span></a> - Interface in <a href="org/apache/hadoop/hbase/coprocessor/package-summary.html">org.apache.hadoop.hbase.coprocessor</a></dt>
 <dd>
@@ -108402,7 +108428,7 @@ service.</div>
 <dd>
 <div class="block">Canary entry point for specified table.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff(Admin, Canary.Sink, HTableDescriptor, ExecutorService, Canary.RegionTask.TaskType, boolean, LongAdder)</a></span> - Static method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff(Admin, Canary.Sink, TableDescriptor, ExecutorService, Canary.RegionTask.TaskType, boolean, LongAdder)</a></span> - Static method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/BlockingRpcConnection.html#socket">socket</a></span> - Variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/BlockingRpcConnection.html" title="class in org.apache.hadoop.hbase.ipc">BlockingRpcConnection</a></dt>
 <dd>&nbsp;</dd>
@@ -113707,7 +113733,9 @@ service.</div>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/impl/RestoreTablesClient.html#targetRootDir">targetRootDir</a></span> - Variable in class org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/RestoreTablesClient.html" title="class in org.apache.hadoop.hbase.backup.impl">RestoreTablesClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">'Target' dependent on 'mode'.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignProcedure.html#targetServer">targetServer</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignProcedure</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
@@ -125579,8 +125607,10 @@ the order they are declared.</div>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/ZooKeeperHelper.html#ZooKeeperHelper--">ZooKeeperHelper()</a></span> - Constructor for class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/ZooKeeperHelper.html" title="class in org.apache.hadoop.hbase.zookeeper">ZooKeeperHelper</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.html#zookeeperMode">zookeeperMode</a></span> - Variable in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.html" title="class in org.apache.hadoop.hbase.tool">Canary</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor(Connection, String[], boolean, Canary.StdOutSink, ExecutorService, boolean, long)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperMonitor</a></dt>
+<dd>
+<div class="block">True if we are to run in zookeeper 'mode'.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor(Connection, String[], boolean, Canary.Sink, ExecutorService, boolean, long)</a></span> - Constructor for class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperMonitor</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.html" title="class in org.apache.hadoop.hbase.coprocessor.example"><span class="typeNameLink">ZooKeeperScanPolicyObserver</span></a> - Class in <a href="org/apache/hadoop/hbase/coprocessor/example/package-summary.html">org.apache.hadoop.hbase.coprocessor.example</a></dt>
 <dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/HConstants.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/HConstants.html b/devapidocs/org/apache/hadoop/hbase/HConstants.html
index 40cc9f9..250f733 100644
--- a/devapidocs/org/apache/hadoop/hbase/HConstants.html
+++ b/devapidocs/org/apache/hadoop/hbase/HConstants.html
@@ -6280,7 +6280,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_DATA_TTL_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1328">HBASE_CANARY_WRITE_DATA_TTL_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1329">HBASE_CANARY_WRITE_DATA_TTL_KEY</a></pre>
 <div class="block">Canary config keys</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -6294,7 +6294,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1330">HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1331">HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY">Constant Field Values</a></dd>
@@ -6307,7 +6307,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1333">HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1334">HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY">Constant Field Values</a></dd>
@@ -6320,7 +6320,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_VALUE_SIZE_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1336">HBASE_CANARY_WRITE_VALUE_SIZE_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1337">HBASE_CANARY_WRITE_VALUE_SIZE_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY">Constant Field Values</a></dd>
@@ -6333,7 +6333,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1338">HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1339">HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY">Constant Field Values</a></dd>
@@ -6346,7 +6346,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_CANARY_READ_RAW_SCAN_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1341">HBASE_CANARY_READ_RAW_SCAN_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1342">HBASE_CANARY_READ_RAW_SCAN_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY">Constant Field Values</a></dd>
@@ -6359,7 +6359,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_CLIENT_KEYTAB_FILE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1346">ZK_CLIENT_KEYTAB_FILE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1347">ZK_CLIENT_KEYTAB_FILE</a></pre>
 <div class="block">Configuration keys for programmatic JAAS configuration for secured ZK interaction</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -6373,7 +6373,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_CLIENT_KERBEROS_PRINCIPAL</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1347">ZK_CLIENT_KERBEROS_PRINCIPAL</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1348">ZK_CLIENT_KERBEROS_PRINCIPAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.ZK_CLIENT_KERBEROS_PRINCIPAL">Constant Field Values</a></dd>
@@ -6386,7 +6386,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_SERVER_KEYTAB_FILE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1349">ZK_SERVER_KEYTAB_FILE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1350">ZK_SERVER_KEYTAB_FILE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.ZK_SERVER_KEYTAB_FILE">Constant Field Values</a></dd>
@@ -6399,7 +6399,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>ZK_SERVER_KERBEROS_PRINCIPAL</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1350">ZK_SERVER_KERBEROS_PRINCIPAL</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1351">ZK_SERVER_KERBEROS_PRINCIPAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.ZK_SERVER_KERBEROS_PRINCIPAL">Constant Field Values</a></dd>
@@ -6412,7 +6412,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>TEMPORARY_FS_DIRECTORY_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1354">TEMPORARY_FS_DIRECTORY_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1355">TEMPORARY_FS_DIRECTORY_KEY</a></pre>
 <div class="block">Config key for hbase temporary directory in hdfs</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -6426,7 +6426,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_TEMPORARY_HDFS_DIRECTORY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1361">DEFAULT_TEMPORARY_HDFS_DIRECTORY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1362">DEFAULT_TEMPORARY_HDFS_DIRECTORY</a></pre>
 <div class="block">Don't use it! This'll get you the wrong path in a secure cluster.
  Use FileSystem.getHomeDirectory() or
  "/user/" + UserGroupInformation.getCurrentUser().getShortUserName()</div>
@@ -6438,7 +6438,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1364">SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1365">SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT">Constant Field Values</a></dd>
@@ -6451,7 +6451,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</h4>
-<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1366">DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
+<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1367">DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.DEFAULT_SNAPSHOT_RESTORE_TAKE_FAILSAFE_SNAPSHOT">Constant Field Values</a></dd>
@@ -6464,7 +6464,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_RESTORE_FAILSAFE_NAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1368">SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1369">SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.SNAPSHOT_RESTORE_FAILSAFE_NAME">Constant Field Values</a></dd>
@@ -6477,7 +6477,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1370">DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1371">DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.DEFAULT_SNAPSHOT_RESTORE_FAILSAFE_NAME">Constant Field Values</a></dd>
@@ -6490,7 +6490,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_LOSSY_COUNTING_ERROR_RATE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1373">DEFAULT_LOSSY_COUNTING_ERROR_RATE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1374">DEFAULT_LOSSY_COUNTING_ERROR_RATE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.DEFAULT_LOSSY_COUNTING_ERROR_RATE">Constant Field Values</a></dd>
@@ -6503,7 +6503,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NOT_IMPLEMENTED</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1375">NOT_IMPLEMENTED</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1376">NOT_IMPLEMENTED</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HConstants.NOT_IMPLEMENTED">Constant Field Values</a></dd>
@@ -6524,7 +6524,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HConstants</h4>
-<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1377">HConstants</a>()</pre>
+<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HConstants.html#line.1378">HConstants</a>()</pre>
 </li>
 </ul>
 </li>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/class-use/HTableDescriptor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/HTableDescriptor.html b/devapidocs/org/apache/hadoop/hbase/class-use/HTableDescriptor.html
index 717b46a..58bb938 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/HTableDescriptor.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/HTableDescriptor.html
@@ -134,10 +134,6 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.rsgroup">org.apache.hadoop.hbase.rsgroup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.tool">org.apache.hadoop.hbase.tool</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
 </tbody>
 </table>
 </li>
@@ -1016,30 +1012,6 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tbody>
 </table>
 </li>
-<li class="blockList"><a name="org.apache.hadoop.hbase.tool">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a> in <a href="../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
-<caption><span>Methods in <a href="../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a> with parameters of type <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Method and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
-     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
-     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
-     boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html b/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
index 3ca42de..41d62e3 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
@@ -10962,10 +10962,10 @@ service.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
              boolean&nbsp;useRegExp,
-             <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+             <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
              boolean&nbsp;writeSniffing,
              <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/client/class-use/Admin.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/Admin.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/Admin.html
index 1781e64..5931206 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/Admin.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/Admin.html
@@ -635,25 +635,25 @@ service.</div>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.HTableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="../../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
      boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;readLatency)</code>
+<div class="block">Canary entry point for specified table.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-java.lang.String-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
+     <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDesc,
      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
      <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
      boolean&nbsp;rawScanEnabled,
-     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;readLatency)</code>
-<div class="block">Canary entry point for specified table.</div>
-</td>
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
index 10e8157..d297ff9 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
@@ -2840,10 +2840,10 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
        long&nbsp;allowedFailures)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
              boolean&nbsp;useRegExp,
-             <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+             <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
              boolean&nbsp;writeSniffing,
              <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
@@ -2853,10 +2853,10 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
              long&nbsp;allowedFailures)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#RegionServerMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-boolean-long-">RegionServerMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                    boolean&nbsp;useRegExp,
-                   <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                   <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                    boolean&nbsp;allRegions,
                    boolean&nbsp;treatFailureAsError,
@@ -2879,10 +2879,10 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#ZookeeperMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-long-">ZookeeperMonitor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                 boolean&nbsp;useRegExp,
-                <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                 boolean&nbsp;treatFailureAsError,
                 long&nbsp;allowedFailures)</code>&nbsp;</td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/client/class-use/TableDescriptor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/TableDescriptor.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/TableDescriptor.html
index e01a4db..11828fc 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/TableDescriptor.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/TableDescriptor.html
@@ -180,6 +180,10 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.tool">org.apache.hadoop.hbase.tool</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.util">org.apache.hadoop.hbase.util</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -2560,6 +2564,30 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tbody>
 </table>
 </li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.tool">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> in <a href="../../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/tool/package-summary.html">org.apache.hadoop.hbase.tool</a> with parameters of type <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">Canary.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.html#sniff-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.tool.Canary.Sink-org.apache.hadoop.hbase.client.TableDescriptor-java.util.concurrent.ExecutorService-org.apache.hadoop.hbase.tool.Canary.RegionTask.TaskType-boolean-java.util.concurrent.atomic.LongAdder-">sniff</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+     <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
+     <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDesc,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
+     <a href="../../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
+     boolean&nbsp;rawScanEnabled,
+     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;rwLatency)</code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.util">
 <!--   -->
 </a>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/client/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-use.html b/devapidocs/org/apache/hadoop/hbase/client/package-use.html
index 994d2e7..85c9105 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-use.html
@@ -3563,6 +3563,14 @@ service.</div>
 <div class="block">Used to communicate with a single HBase table.</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/client/class-use/TableDescriptor.html#org.apache.hadoop.hbase.tool">TableDescriptor</a>
+<div class="block">TableDescriptor contains the details about an HBase table such as the descriptors of
+ all the column families, is the table a catalog table, <code> hbase:meta </code>,
+ if the table is read only, the maximum size of the memstore,
+ when the region split should occur, coprocessors associated with it etc...</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index bd6fd7e..c069040 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -295,8 +295,8 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 </ul>
 </li>
 </ul>


[15/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></

<TRUNCATED>

[08/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a nam

<TRUNCATED>

[30/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
index a1e50c1..680051d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -1754,7 +1754,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2434">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2435">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -1763,7 +1763,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2438">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2439">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 </li>
@@ -1810,7 +1810,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemstore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.336">getMemstore</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.337">getMemstore</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>MemStore Instance to use in this store.</dd>
@@ -1823,7 +1823,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createCacheConf</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.370">createCacheConf</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.371">createCacheConf</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
 <div class="block">Creates the cache config.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1837,7 +1837,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreEngine</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.382">createStoreEngine</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.383">createStoreEngine</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                  <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;kvComparator)
                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1861,7 +1861,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>determineTTLFromFamily</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.391">determineTTLFromFamily</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.392">determineTTLFromFamily</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>family</code> - </dd>
@@ -1876,7 +1876,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumnFamilyName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.407">getColumnFamilyName</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.408">getColumnFamilyName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getColumnFamilyName--">getColumnFamilyName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1889,7 +1889,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.412">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.413">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1902,7 +1902,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.417">getFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.418">getFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFileSystem--">getFileSystem</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1915,7 +1915,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionFileSystem</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.421">getRegionFileSystem</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.422">getRegionFileSystem</a>()</pre>
 </li>
 </ul>
 <a name="getStoreFileTtl--">
@@ -1924,7 +1924,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileTtl</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.427">getStoreFileTtl</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.428">getStoreFileTtl</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getStoreFileTtl--">getStoreFileTtl</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -1939,7 +1939,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreFlushSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.433">getMemStoreFlushSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.434">getMemStoreFlushSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getMemStoreFlushSize--">getMemStoreFlushSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -1954,7 +1954,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushableSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.439">getFlushableSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.440">getFlushableSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFlushableSize--">getFlushableSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1971,7 +1971,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.444">getSnapshotSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.445">getSnapshotSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getSnapshotSize--">getSnapshotSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1986,7 +1986,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionCheckMultiplier</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.449">getCompactionCheckMultiplier</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.450">getCompactionCheckMultiplier</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getCompactionCheckMultiplier--">getCompactionCheckMultiplier</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -2003,7 +2003,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockingFileCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.454">getBlockingFileCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.455">getBlockingFileCount</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getBlockingFileCount--">StoreConfigInformation</a></code></span></div>
 <div class="block">The number of files required before flushes for this store will be blocked.</div>
 <dl>
@@ -2018,7 +2018,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getBytesPerChecksum</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.464">getBytesPerChecksum</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.465">getBytesPerChecksum</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns the configured bytesPerChecksum value.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2034,7 +2034,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getChecksumType</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util">ChecksumType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.474">getChecksumType</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util">ChecksumType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.475">getChecksumType</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns the configured checksum algorithm.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2050,7 +2050,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCloseCheckInterval</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.486">getCloseCheckInterval</a>()</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.487">getCloseCheckInterval</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>how many bytes to write between status checks</dd>
@@ -2063,7 +2063,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumnFamilyDescriptor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.491">getColumnFamilyDescriptor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.492">getColumnFamilyDescriptor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getColumnFamilyDescriptor--">getColumnFamilyDescriptor</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2076,7 +2076,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxSequenceId</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.496">getMaxSequenceId</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.497">getMaxSequenceId</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMaxSequenceId--">getMaxSequenceId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2091,7 +2091,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxMemStoreTS</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.501">getMaxMemStoreTS</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.502">getMaxMemStoreTS</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMaxMemStoreTS--">getMaxMemStoreTS</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2107,7 +2107,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <li class="blockList">
 <h4>getStoreHomedir</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.512">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
+public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.513">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                                                                     <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                                                                     byte[]&nbsp;family)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
@@ -2128,7 +2128,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <li class="blockList">
 <h4>getStoreHomedir</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.524">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
+public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.525">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                                                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedName,
                                                                     byte[]&nbsp;family)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
@@ -2148,7 +2148,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockEncoder</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.532">getDataBlockEncoder</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.533">getDataBlockEncoder</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the data block encoder</dd>
@@ -2161,7 +2161,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setDataBlockEncoderInTest</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.540">setDataBlockEncoderInTest</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;blockEncoder)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.541">setDataBlockEncoderInTest</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;blockEncoder)</pre>
 <div class="block">Should be used only in tests.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2175,7 +2175,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>loadStoreFiles</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.549">loadStoreFiles</a>()
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.550">loadStoreFiles</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Creates an unsorted list of StoreFile loaded in parallel
  from the given directory.</div>
@@ -2191,7 +2191,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>openStoreFiles</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.554">openStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;files)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.555">openStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;files)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2205,7 +2205,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.614">refreshStoreFiles</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.615">refreshStoreFiles</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#refreshStoreFiles--">Store</a></code></span></div>
 <div class="block">Checks the underlying store files, and opens the files that have not been opened, and removes
@@ -2225,7 +2225,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.624">refreshStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;newFiles)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.625">refreshStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;newFiles)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Replaces the store files that the store has with the given files. Mainly used by secondary
  region replicas to keep up to date with the primary region files.</div>
@@ -2241,7 +2241,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFilesInternal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.639">refreshStoreFilesInternal</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;newFiles)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.640">refreshStoreFilesInternal</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;newFiles)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Checks the underlying store files, and opens the files that  have not
  been opened, and removes the store file readers for store files no longer
@@ -2259,7 +2259,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreFileAndReader</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.692">createStoreFileAndReader</a>(org.apache.hadoop.fs.Path&nbsp;p)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.693">createStoreFileAndReader</a>(org.apache.hadoop.fs.Path&nbsp;p)
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2273,7 +2273,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreFileAndReader</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.697">createStoreFileAndReader</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;info)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.698">createStoreFileAndReader</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;info)
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2287,7 +2287,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>startReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.709">startReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.710">startReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that next coming updates
  are going to be part of the replaying edits from WAL</div>
 </li>
@@ -2298,7 +2298,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>stopReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.717">stopReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.718">stopReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that the replaying edits from WAL
  are done</div>
 </li>
@@ -2309,7 +2309,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.724">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.725">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreSizing)</pre>
 <div class="block">Adds a value to the memstore</div>
 </li>
@@ -2320,7 +2320,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.741">add</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.742">add</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreSizing)</pre>
 <div class="block">Adds the specified value to the memstore</div>
 </li>
@@ -2331,7 +2331,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>timeOfOldestEdit</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.756">timeOfOldestEdit</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.757">timeOfOldestEdit</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#timeOfOldestEdit--">Store</a></code></span></div>
 <div class="block">When was the last edit done in the memstore</div>
 <dl>
@@ -2346,7 +2346,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStorefiles</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.764">getStorefiles</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.765">getStorefiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getStorefiles--">getStorefiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2361,7 +2361,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactedFiles</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.769">getCompactedFiles</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.770">getCompactedFiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactedFiles--">getCompactedFiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2374,7 +2374,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>assertBulkLoadHFileOk</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.777">assertBulkLoadHFileOk</a>(org.apache.hadoop.fs.Path&nbsp;srcPath)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.778">assertBulkLoadHFileOk</a>(org.apache.hadoop.fs.Path&nbsp;srcPath)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This throws a WrongRegionException if the HFile does not fit in this region, or an
  InvalidHFileException if the HFile is not valid.</div>
@@ -2390,7 +2390,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>preBulkLoadHFile</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.856">preBulkLoadHFile</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPathStr,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.857">preBulkLoadHFile</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPathStr,
                                                                                   long&nbsp;seqNum)
                                                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This method should only be called from Region. It is assumed that the ranges of values in the
@@ -2410,7 +2410,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.861">bulkLoadHFile</a>(byte[]&nbsp;family,
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.862">bulkLoadHFile</a>(byte[]&nbsp;family,
                                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPathStr,
                                                org.apache.hadoop.fs.Path&nbsp;dstPath)
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2426,7 +2426,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.883">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;fileInfo)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.884">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;fileInfo)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2440,7 +2440,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.888">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;sf)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.889">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;sf)
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2454,7 +2454,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableCollection&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.920">close</a>()
+<pre>public&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableCollection&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.921">close</a>()
                                                                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Close all the readers We don't need to worry about subsequent requests because the Region holds
  a write lock that will prevent any more reads or writes.</div>
@@ -2472,7 +2472,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.987">snapshot</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.988">snapshot</a>()</pre>
 <div class="block">Snapshot this stores memstore. Call before running
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#flushCache-long-org.apache.hadoop.hbase.regionserver.MemStoreSnapshot-org.apache.hadoop.hbase.monitoring.MonitoredTask-org.apache.hadoop.hbase.regionserver.throttle.ThroughputController-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-"><code>flushCache(long, MemStoreSnapshot, MonitoredTask, ThroughputController,
  FlushLifeCycleTracker)</code></a>
@@ -2485,7 +2485,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCache</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1005">flushCache</a>(long&nbsp;logCacheFlushId,
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1006">flushCache</a>(long&nbsp;logCacheFlushId,
                                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a>&nbsp;snapshot,
                                                      <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status,
                                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.html" title="interface in org.apache.hadoop.hbase.regionserver.throttle">ThroughputController</a>&nbsp;throughputController,
@@ -2511,7 +2511,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>commitFile</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1058">commitFile</a>(org.apache.hadoop.fs.Path&nbsp;path,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1059">commitFile</a>(org.apache.hadoop.fs.Path&nbsp;path,
                               long&nbsp;logCacheFlushId,
                               <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2533,7 +2533,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createWriterInTmp</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1088">createWriterInTmp</a>(long&nbsp;maxKeyCount,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1089">createWriterInTmp</a>(long&nbsp;maxKeyCount,
                                          <a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compression,
                                          boolean&nbsp;isCompaction,
                                          boolean&nbsp;includeMVCCReadpoint,
@@ -2560,7 +2560,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createFileContext</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1119">createFileContext</a>(<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compression,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1120">createFileContext</a>(<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compression,
                                        boolean&nbsp;includeMVCCReadpoint,
                                        boolean&nbsp;includesTag,
                                        <a href="../../../../../org/apache/hadoop/hbase/io/crypto/Encryption.Context.html" title="class in org.apache.hadoop.hbase.io.crypto">Encryption.Context</a>&nbsp;cryptoContext)</pre>
@@ -2572,7 +2572,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalSize</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1141">getTotalSize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1142">getTotalSize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)</pre>
 </li>
 </ul>
 <a name="updateStorefiles-java.util.List-long-">
@@ -2581,7 +2581,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStorefiles</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1152">updateStorefiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1153">updateStorefiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
                                  long&nbsp;snapshotId)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Change storeFiles adding into place the Reader produced by this new flush.</div>
@@ -2602,7 +2602,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>notifyChangedReadersObservers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1183">notifyChangedReadersObservers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1184">notifyChangedReadersObservers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Notify all observers that set of Readers has changed.</div>
 <dl>
@@ -2617,7 +2617,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanners</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1207">getScanners</a>(boolean&nbsp;cacheBlocks,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1208">getScanners</a>(boolean&nbsp;cacheBlocks,
                                          boolean&nbsp;isGet,
                                          boolean&nbsp;usePread,
                                          boolean&nbsp;isCompaction,
@@ -2649,7 +2649,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanners</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1227">getScanners</a>(boolean&nbsp;cacheBlocks,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1228">getScanners</a>(boolean&nbsp;cacheBlocks,
                                          boolean&nbsp;usePread,
                                          boolean&nbsp;isCompaction,
                                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.html" title="class in org.apache.hadoop.hbase.regionserver.querymatcher">ScanQueryMatcher</a>&nbsp;matcher,
@@ -2684,7 +2684,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanners</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1269">getScanners</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1270">getScanners</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
                                          boolean&nbsp;cacheBlocks,
                                          boolean&nbsp;isGet,
                                          boolean&nbsp;usePread,
@@ -2721,7 +2721,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanners</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1293">getScanners</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1294">getScanners</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
                                          boolean&nbsp;cacheBlocks,
                                          boolean&nbsp;usePread,
                                          boolean&nbsp;isCompaction,
@@ -2761,7 +2761,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>addChangedReaderObserver</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1320">addChangedReaderObserver</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.html" title="interface in org.apache.hadoop.hbase.regionserver">ChangedReadersObserver</a>&nbsp;o)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1321">addChangedReaderObserver</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.html" title="interface in org.apache.hadoop.hbase.regionserver">ChangedReadersObserver</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>o</code> - Observer who wants to know about changes in set of Readers</dd>
@@ -2774,7 +2774,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteChangedReaderObserver</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1327">deleteChangedReaderObserver</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.html" title="interface in org.apache.hadoop.hbase.regionserver">ChangedReadersObserver</a>&nbsp;o)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1328">deleteChangedReaderObserver</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.html" title="interface in org.apache.hadoop.hbase.regionserver">ChangedReadersObserver</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>o</code> - Observer no longer interested in changes in set of Readers.</dd>
@@ -2787,7 +2787,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>compact</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1379">compact</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&nbsp;compaction,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1380">compact</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&nbsp;compaction,
                                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.html" title="interface in org.apache.hadoop.hbase.regionserver.throttle">ThroughputController</a>&nbsp;throughputController,
                                 <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2844,7 +2844,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>doCompaction</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1411">doCompaction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1412">doCompaction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToCompact,
                                         <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user,
                                         long&nbsp;compactionStartTime,
@@ -2862,7 +2862,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>moveCompactedFilesIntoPlace</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1444">moveCompactedFilesIntoPlace</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1445">moveCompactedFilesIntoPlace</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;newFiles,
                                                      <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2878,7 +2878,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>moveFileIntoPlace</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1460">moveFileIntoPlace</a>(org.apache.hadoop.fs.Path&nbsp;newFile)
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1461">moveFileIntoPlace</a>(org.apache.hadoop.fs.Path&nbsp;newFile)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2892,7 +2892,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>writeCompactionWalRecord</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1472">writeCompactionWalRecord</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesCompacted,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1473">writeCompactionWalRecord</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesCompacted,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;newFiles)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Writes the compaction WAL record.</div>
@@ -2911,7 +2911,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>replaceStoreFiles</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1492">replaceStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedFiles,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1493">replaceStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedFiles,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;result)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -2926,7 +2926,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>updateSpaceQuotaAfterFileReplacement</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1523">updateSpaceQuotaAfterFileReplacement</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;sizeStore,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1524">updateSpaceQuotaAfterFileReplacement</a>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;sizeStore,
                                           <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;oldFiles,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;newFiles)</pre>
@@ -2947,7 +2947,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>logCompactionEndMessage</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1550">logCompactionEndMessage</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1551">logCompactionEndMessage</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
                                      long&nbsp;now,
                                      long&nbsp;compactionStartTime)</pre>
@@ -2966,7 +2966,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>replayCompactionMarker</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1589">replayCompactionMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1590">replayCompactionMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
                                    boolean&nbsp;pickCompactionFiles,
                                    boolean&nbsp;removeFiles)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -2987,7 +2987,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>compactRecentForTestingAssumingDefaultPolicy</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1654">compactRecentForTestingAssumingDefaultPolicy</a>(int&nbsp;N)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1655">compactRecentForTestingAssumingDefaultPolicy</a>(int&nbsp;N)
                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This method tries to compact N recent files for testing.
  Note that because compacting "recent" files only makes sense for some policies,
@@ -3007,7 +3007,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>hasReferences</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1706">hasReferences</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1707">hasReferences</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#hasReferences--">hasReferences</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -3022,7 +3022,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionProgress</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionProgress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1735">getCompactionProgress</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionProgress</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1736">getCompactionProgress</a>()</pre>
 <div class="block">getter for CompactionProgress object</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -3036,7 +3036,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldPerformMajorCompaction</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1740">shouldPerformMajorCompaction</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1741">shouldPerformMajorCompaction</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#shouldPerformMajorCompaction--">Store</a></code></span></div>
 <div class="block">Tests whether we should run a major compaction. For example, if the configured major compaction
@@ -3057,7 +3057,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>requestCompaction</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1752">requestCompaction</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1753">requestCompaction</a>()
                                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3071,7 +3071,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>requestCompaction</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1756">requestCompaction</a>(int&nbsp;priority,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1757">requestCompaction</a>(int&nbsp;priority,
                                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionLifeCycleTr

<TRUNCATED>

[05/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 1ed32d0..5581885 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181016" />
+    <meta name="Date-Revision-yyyymmdd" content="20181017" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -433,7 +433,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-17</li>
             </p>
                 </div>
 

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 83944af..39c4e18 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="20181016" />
+    <meta name="Date-Revision-yyyymmdd" content="20181017" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -501,7 +501,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-16</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-17</li>
             </p>
                 </div>
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
index e1001f1..fa41d4b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html#line.355">TestChecksum.CorruptedFSReaderImpl</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html#line.353">TestChecksum.CorruptedFSReaderImpl</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">This class is to test checksum behavior when data is corrupted. It mimics the following
  behavior:
@@ -273,7 +273,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>corruptDataStream</h4>
-<pre>boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.359">corruptDataStream</a></pre>
+<pre>boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.357">corruptDataStream</a></pre>
 <div class="block">If set to true, corrupt reads using readAtOffset(...).</div>
 </li>
 </ul>
@@ -300,7 +300,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CorruptedFSReaderImpl</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.361">CorruptedFSReaderImpl</a>(org.apache.hadoop.hbase.io.FSDataInputStreamWrapper&nbsp;istream,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.359">CorruptedFSReaderImpl</a>(org.apache.hadoop.hbase.io.FSDataInputStreamWrapper&nbsp;istream,
                              long&nbsp;fileSize,
                              org.apache.hadoop.fs.FileSystem&nbsp;fs,
                              org.apache.hadoop.fs.Path&nbsp;path,
@@ -326,7 +326,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readBlockDataInternal</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.io.hfile.HFileBlock&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.367">readBlockDataInternal</a>(org.apache.hadoop.fs.FSDataInputStream&nbsp;is,
+<pre>protected&nbsp;org.apache.hadoop.hbase.io.hfile.HFileBlock&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.365">readBlockDataInternal</a>(org.apache.hadoop.fs.FSDataInputStream&nbsp;is,
                                                                             long&nbsp;offset,
                                                                             long&nbsp;onDiskSizeWithHeaderL,
                                                                             boolean&nbsp;pread,
@@ -345,7 +345,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readAtOffset</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.380">readAtOffset</a>(org.apache.hadoop.fs.FSDataInputStream&nbsp;istream,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html#line.378">readAtOffset</a>(org.apache.hadoop.fs.FSDataInputStream&nbsp;istream,
                            byte[]&nbsp;dest,
                            int&nbsp;destOffset,
                            int&nbsp;size,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
index 0fdc167..a826b49 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestChecksum.html
@@ -467,7 +467,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>validateData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html#line.338">validateData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a>&nbsp;in)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.html#line.336">validateData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html?is-external=true" title="class or interface in java.io">DataInputStream</a>&nbsp;in)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
index cf691bd..104a13a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.653">TestHFileBlock.BlockReaderThread</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.654">TestHFileBlock.BlockReaderThread</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;</pre>
 </li>
@@ -226,7 +226,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>clientId</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.654">clientId</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.655">clientId</a></pre>
 </li>
 </ul>
 <a name="hbr">
@@ -235,7 +235,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>hbr</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.io.hfile.HFileBlock.FSReader <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.655">hbr</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.io.hfile.HFileBlock.FSReader <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.656">hbr</a></pre>
 </li>
 </ul>
 <a name="offsets">
@@ -244,7 +244,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>offsets</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.656">offsets</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.657">offsets</a></pre>
 </li>
 </ul>
 <a name="types">
@@ -253,7 +253,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>types</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.io.hfile.BlockType&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.657">types</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.io.hfile.BlockType&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.658">types</a></pre>
 </li>
 </ul>
 <a name="fileSize">
@@ -262,7 +262,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>fileSize</h4>
-<pre>private final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.658">fileSize</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.659">fileSize</a></pre>
 </li>
 </ul>
 </li>
@@ -279,7 +279,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BlockReaderThread</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.660">BlockReaderThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clientId,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.661">BlockReaderThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clientId,
                          org.apache.hadoop.hbase.io.hfile.HFileBlock.FSReader&nbsp;hbr,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;offsets,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.io.hfile.BlockType&gt;&nbsp;types,
@@ -300,7 +300,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.671">call</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.BlockReaderThread.html#line.672">call</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
index 3d010ce..26afeff 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html
@@ -739,7 +739,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>buildMessageDetails</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.491">buildMessageDetails</a>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression,
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.493">buildMessageDetails</a>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression,
                                   org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;encoding,
                                   boolean&nbsp;pread)</pre>
 </li>
@@ -750,7 +750,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertBuffersEqual</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.496">assertBuffersEqual</a>(org.apache.hadoop.hbase.nio.ByteBuff&nbsp;expectedBuffer,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.498">assertBuffersEqual</a>(org.apache.hadoop.hbase.nio.ByteBuff&nbsp;expectedBuffer,
                                org.apache.hadoop.hbase.nio.ByteBuff&nbsp;actualBuffer,
                                org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression,
                                org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;encoding,
@@ -763,7 +763,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nextBytesToStr</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.519">nextBytesToStr</a>(org.apache.hadoop.hbase.nio.ByteBuff&nbsp;buf,
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.521">nextBytesToStr</a>(org.apache.hadoop.hbase.nio.ByteBuff&nbsp;buf,
                                      int&nbsp;pos)</pre>
 <div class="block">Convert a few next bytes in the given buffer at the given position to
  string. Used for error messages.</div>
@@ -775,7 +775,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPreviousOffset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.527">testPreviousOffset</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.529">testPreviousOffset</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -789,7 +789,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPreviousOffsetInternals</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.531">testPreviousOffsetInternals</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.533">testPreviousOffsetInternals</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -803,7 +803,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>defaultRandom</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.649">defaultRandom</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.650">defaultRandom</a>()</pre>
 </li>
 </ul>
 <a name="testConcurrentReading--">
@@ -812,7 +812,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testConcurrentReading</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.718">testConcurrentReading</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.719">testConcurrentReading</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -826,7 +826,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testConcurrentReadingInternals</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.722">testConcurrentReadingInternals</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.723">testConcurrentReadingInternals</a>()
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></pre>
@@ -844,7 +844,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeBlocks</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.762">writeBlocks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;rand,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.763">writeBlocks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;rand,
                          org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compressAlgo,
                          org.apache.hadoop.fs.Path&nbsp;path,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;expectedOffsets,
@@ -864,7 +864,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBlockHeapSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.825">testBlockHeapSize</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.826">testBlockHeapSize</a>()</pre>
 </li>
 </ul>
 <a name="testBlockHeapSizeInternals--">
@@ -873,7 +873,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBlockHeapSizeInternals</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.829">testBlockHeapSizeInternals</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.830">testBlockHeapSizeInternals</a>()</pre>
 </li>
 </ul>
 <a name="testSerializeWithoutNextBlockMetadata--">
@@ -882,7 +882,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testSerializeWithoutNextBlockMetadata</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.863">testSerializeWithoutNextBlockMetadata</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#line.864">testSerializeWithoutNextBlockMetadata</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/org/apache/hadoop/hbase/tool/TestCanaryTool.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/tool/TestCanaryTool.html b/testdevapidocs/org/apache/hadoop/hbase/tool/TestCanaryTool.html
index cbe4e39..6df6cd9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/tool/TestCanaryTool.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/tool/TestCanaryTool.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.62">TestCanaryTool</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.63">TestCanaryTool</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.65">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.66">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="testingUtility">
@@ -270,7 +270,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testingUtility</h4>
-<pre>private&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/tool/TestCanaryTool.html#line.68">testingUtility</a></pre>
+<pre>private&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/tool/TestCanaryTool.html#line.69">testingUtility</a></pre>
 </li>
 </ul>
 <a name="FAMILY">
@@ -279,7 +279,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>FAMILY</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.69">FAMILY</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.70">FAMILY</a></pre>
 </li>
 </ul>
 <a name="COLUMN">
@@ -288,7 +288,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>COLUMN</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.70">COLUMN</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.71">COLUMN</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -297,7 +297,7 @@ extends <a href="https://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/tool/TestCanaryTool.html#line.73">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.74">name</a></pre>
 </li>
 </ul>
 <a name="mockAppender">
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <li class="blockList">
 <h4>mockAppender</h4>
 <pre>@Mock
-org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.89">mockAppender</a></pre>
+org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.90">mockAppender</a></pre>
 </li>
 </ul>
 </li>
@@ -324,7 +324,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestCanaryTool</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.62">TestCanaryTool</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.63">TestCanaryTool</a>()</pre>
 </li>
 </ul>
 </li>
@@ -341,7 +341,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.76">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.77">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -355,7 +355,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.83">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.84">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -369,7 +369,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testBasicZookeeperCanaryWorks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.92">testBasicZookeeperCanaryWorks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.93">testBasicZookeeperCanaryWorks</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -383,7 +383,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testZookeeperCanaryPermittedFailuresArgumentWorks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.98">testZookeeperCanaryPermittedFailuresArgumentWorks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.99">testZookeeperCanaryPermittedFailuresArgumentWorks</a>()
                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -397,7 +397,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testBasicCanaryWorks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.104">testBasicCanaryWorks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.105">testBasicCanaryWorks</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -411,7 +411,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testReadTableTimeouts</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.127">testReadTableTimeouts</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.128">testReadTableTimeouts</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -425,7 +425,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testWriteTableTimeout</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.171">testWriteTableTimeout</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.173">testWriteTableTimeout</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -439,7 +439,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionserverNoRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.190">testRegionserverNoRegions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.192">testRegionserverNoRegions</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -453,7 +453,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionserverWithRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.202">testRegionserverWithRegions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.204">testRegionserverWithRegions</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -467,7 +467,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>testRawScanConfig</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.215">testRawScanConfig</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.217">testRawScanConfig</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -481,7 +481,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>runRegionserverCanary</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.239">runRegionserverCanary</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.241">runRegionserverCanary</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -495,7 +495,7 @@ org.apache.log4j.Appender <a href="../../../../../src-html/org/apache/hadoop/hba
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testZookeeperCanaryWithArgs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.247">testZookeeperCanaryWithArgs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/TestCanaryTool.html#line.249">testZookeeperCanaryWithArgs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
index 36bea79..2dd2eb6 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestChecksum.CorruptedFSReaderImpl.html
@@ -307,105 +307,103 @@
 <span class="sourceLineNo">299</span>        long expectedChunks = ChecksumUtil.numChunks(<a name="line.299"></a>
 <span class="sourceLineNo">300</span>                               dataSize + HConstants.HFILEBLOCK_HEADER_SIZE,<a name="line.300"></a>
 <span class="sourceLineNo">301</span>                               bytesPerChecksum);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        LOG.info("testChecksumChunks: pread=" + pread +<a name="line.302"></a>
-<span class="sourceLineNo">303</span>                   ", bytesPerChecksum=" + bytesPerChecksum +<a name="line.303"></a>
-<span class="sourceLineNo">304</span>                   ", fileSize=" + totalSize +<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                   ", dataSize=" + dataSize +<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                   ", expectedChunks=" + expectedChunks);<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>        // Verify hbase checksums.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        assertEquals(true, hfs.useHBaseChecksum());<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>        // Read data back from file.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        FSDataInputStream is = fs.open(path);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        FSDataInputStream nochecksum = hfs.getNoChecksumFs().open(path);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        meta = new HFileContextBuilder()<a name="line.314"></a>
-<span class="sourceLineNo">315</span>               .withCompression(algo)<a name="line.315"></a>
-<span class="sourceLineNo">316</span>               .withIncludesMvcc(true)<a name="line.316"></a>
-<span class="sourceLineNo">317</span>               .withIncludesTags(useTags)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>               .withHBaseCheckSum(true)<a name="line.318"></a>
-<span class="sourceLineNo">319</span>               .withBytesPerCheckSum(bytesPerChecksum)<a name="line.319"></a>
-<span class="sourceLineNo">320</span>               .build();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(new FSDataInputStreamWrapper(<a name="line.321"></a>
-<span class="sourceLineNo">322</span>            is, nochecksum), totalSize, hfs, path, meta);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        HFileBlock b = hbr.readBlockData(0, -1, pread, false);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        is.close();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        b.sanityCheck();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        assertEquals(dataSize, b.getUncompressedSizeWithoutHeader());<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>        // verify that we have the expected number of checksum chunks<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        assertEquals(totalSize, HConstants.HFILEBLOCK_HEADER_SIZE + dataSize +<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                     expectedChunks * HFileBlock.CHECKSUM_SIZE);<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>        // assert that we did not encounter hbase checksum verification failures<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private void validateData(DataInputStream in) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // validate data<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    for (int i = 0; i &lt; 1234; i++) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      int val = in.readInt();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      assertEquals("testChecksumCorruption: data mismatch at index " + i, i, val);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  /**<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   * This class is to test checksum behavior when data is corrupted. It mimics the following<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * behavior:<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   *  - When fs checksum is disabled, hbase may get corrupted data from hdfs. If verifyChecksum<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   *  is true, it means hbase checksum is on and fs checksum is off, so we corrupt the data.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   *  - When fs checksum is enabled, hdfs will get a different copy from another node, and will<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   *    always return correct data. So we don't corrupt the data when verifyChecksum for hbase is<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   *    off.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   */<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  static private class CorruptedFSReaderImpl extends HFileBlock.FSReaderImpl {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    /**<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     * If set to true, corrupt reads using readAtOffset(...).<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    boolean corruptDataStream = false;<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>    public CorruptedFSReaderImpl(FSDataInputStreamWrapper istream, long fileSize, FileSystem fs,<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        Path path, HFileContext meta) throws IOException {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      super(istream, fileSize, (HFileSystem) fs, path, meta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>    @Override<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    protected HFileBlock readBlockDataInternal(FSDataInputStream is, long offset,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        long onDiskSizeWithHeaderL, boolean pread, boolean verifyChecksum, boolean updateMetrics)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        throws IOException {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (verifyChecksum) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        corruptDataStream = true;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      HFileBlock b = super.readBlockDataInternal(is, offset, onDiskSizeWithHeaderL, pread,<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          verifyChecksum, updateMetrics);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      corruptDataStream = false;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      return b;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    @Override<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    protected int readAtOffset(FSDataInputStream istream, byte [] dest, int destOffset, int size,<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        boolean peekIntoNextBlock, long fileOffset, boolean pread) throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      int returnValue = super.readAtOffset(istream, dest, destOffset, size, peekIntoNextBlock,<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          fileOffset, pread);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      if (!corruptDataStream) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        return returnValue;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      // Corrupt 3rd character of block magic of next block's header.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      if (peekIntoNextBlock) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        dest[destOffset + size + 3] = 0b00000000;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      // We might be reading this block's header too, corrupt it.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      dest[destOffset + 1] = 0b00000000;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      // Corrupt non header data<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (size &gt; hdrSize) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        dest[destOffset + hdrSize + 1] = 0b00000000;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      return returnValue;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>}<a name="line.400"></a>
+<span class="sourceLineNo">302</span>        LOG.info("testChecksumChunks: pread={}, bytesPerChecksum={}, fileSize={}, "<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                + "dataSize={}, expectedChunks={}, compression={}", pread, bytesPerChecksum,<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            totalSize, dataSize, expectedChunks, algo.toString());<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>        // Verify hbase checksums.<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        assertEquals(true, hfs.useHBaseChecksum());<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>        // Read data back from file.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        FSDataInputStream is = fs.open(path);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        FSDataInputStream nochecksum = hfs.getNoChecksumFs().open(path);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        meta = new HFileContextBuilder()<a name="line.312"></a>
+<span class="sourceLineNo">313</span>               .withCompression(algo)<a name="line.313"></a>
+<span class="sourceLineNo">314</span>               .withIncludesMvcc(true)<a name="line.314"></a>
+<span class="sourceLineNo">315</span>               .withIncludesTags(useTags)<a name="line.315"></a>
+<span class="sourceLineNo">316</span>               .withHBaseCheckSum(true)<a name="line.316"></a>
+<span class="sourceLineNo">317</span>               .withBytesPerCheckSum(bytesPerChecksum)<a name="line.317"></a>
+<span class="sourceLineNo">318</span>               .build();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        HFileBlock.FSReader hbr = new HFileBlock.FSReaderImpl(new FSDataInputStreamWrapper(<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            is, nochecksum), totalSize, hfs, path, meta);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        HFileBlock b = hbr.readBlockData(0, -1, pread, false);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        is.close();<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        b.sanityCheck();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>        assertEquals(dataSize, b.getUncompressedSizeWithoutHeader());<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>        // verify that we have the expected number of checksum chunks<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        assertEquals(totalSize, HConstants.HFILEBLOCK_HEADER_SIZE + dataSize +<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                     expectedChunks * HFileBlock.CHECKSUM_SIZE);<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>        // assert that we did not encounter hbase checksum verification failures<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        assertEquals(0, HFile.getAndResetChecksumFailuresCount());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private void validateData(DataInputStream in) throws IOException {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    // validate data<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    for (int i = 0; i &lt; 1234; i++) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      int val = in.readInt();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      assertEquals("testChecksumCorruption: data mismatch at index " + i, i, val);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  /**<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * This class is to test checksum behavior when data is corrupted. It mimics the following<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * behavior:<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   *  - When fs checksum is disabled, hbase may get corrupted data from hdfs. If verifyChecksum<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   *  is true, it means hbase checksum is on and fs checksum is off, so we corrupt the data.<a name="line.348"></a>
+<span class="sourceLineNo">349</span>   *  - When fs checksum is enabled, hdfs will get a different copy from another node, and will<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   *    always return correct data. So we don't corrupt the data when verifyChecksum for hbase is<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   *    off.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  static private class CorruptedFSReaderImpl extends HFileBlock.FSReaderImpl {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    /**<a name="line.354"></a>
+<span class="sourceLineNo">355</span>     * If set to true, corrupt reads using readAtOffset(...).<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    boolean corruptDataStream = false;<a name="line.357"></a>
+<span class="sourceLineNo">358</span><a name="line.358"></a>
+<span class="sourceLineNo">359</span>    public CorruptedFSReaderImpl(FSDataInputStreamWrapper istream, long fileSize, FileSystem fs,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        Path path, HFileContext meta) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      super(istream, fileSize, (HFileSystem) fs, path, meta);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>    @Override<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    protected HFileBlock readBlockDataInternal(FSDataInputStream is, long offset,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        long onDiskSizeWithHeaderL, boolean pread, boolean verifyChecksum, boolean updateMetrics)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        throws IOException {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      if (verifyChecksum) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        corruptDataStream = true;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      HFileBlock b = super.readBlockDataInternal(is, offset, onDiskSizeWithHeaderL, pread,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          verifyChecksum, updateMetrics);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      corruptDataStream = false;<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      return b;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    @Override<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    protected int readAtOffset(FSDataInputStream istream, byte [] dest, int destOffset, int size,<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        boolean peekIntoNextBlock, long fileOffset, boolean pread) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      int returnValue = super.readAtOffset(istream, dest, destOffset, size, peekIntoNextBlock,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          fileOffset, pread);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      if (!corruptDataStream) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        return returnValue;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      // Corrupt 3rd character of block magic of next block's header.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      if (peekIntoNextBlock) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        dest[destOffset + size + 3] = 0b00000000;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      // We might be reading this block's header too, corrupt it.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      dest[destOffset + 1] = 0b00000000;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      // Corrupt non header data<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      if (size &gt; hdrSize) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        dest[destOffset + hdrSize + 1] = 0b00000000;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      return returnValue;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
+<span class="sourceLineNo">398</span>}<a name="line.398"></a>
 
 
 


[35/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

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


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

Branch: refs/heads/asf-site
Commit: 713132a3deef420e44764a4d1efad445d407f8aa
Parents: 6129abc
Author: jenkins <bu...@apache.org>
Authored: Wed Oct 17 14:53:08 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Wed Oct 17 14:53:08 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 11130 +++++++++--------
 apidocs/org/apache/hadoop/hbase/HConstants.html |    36 +-
 .../org/apache/hadoop/hbase/HConstants.html     |   107 +-
 book.html                                       |   150 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |   382 +-
 checkstyle.rss                                  |     6 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     4 +-
 devapidocs/index-all.html                       |    76 +-
 .../org/apache/hadoop/hbase/HConstants.html     |    38 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hbase/class-use/HTableDescriptor.html       |    28 -
 .../hadoop/hbase/class-use/TableName.html       |     4 +-
 .../hadoop/hbase/client/class-use/Admin.html    |    16 +-
 .../hbase/client/class-use/Connection.html      |    12 +-
 .../hbase/client/class-use/TableDescriptor.html |    28 +
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../apache/hadoop/hbase/client/package-use.html |     8 +
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     2 +-
 .../hbase/master/procedure/package-tree.html    |     4 +-
 .../hadoop/hbase/monitoring/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    14 +-
 .../org/apache/hadoop/hbase/package-use.html    |    12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |    34 +-
 .../hadoop/hbase/regionserver/HStore.html       |   298 +-
 .../Compactor.InternalScannerFactory.html       |     6 +-
 .../regionserver/compactions/Compactor.html     |    24 +-
 .../hadoop/hbase/regionserver/package-tree.html |    18 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../hadoop/hbase/replication/package-tree.html  |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |    45 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |    57 +-
 .../hbase/tool/Canary.RegionServerMonitor.html  |    29 +-
 .../tool/Canary.RegionServerStdOutSink.html     |     9 +-
 .../hbase/tool/Canary.RegionServerTask.html     |    19 +-
 .../hbase/tool/Canary.RegionStdOutSink.html     |    29 +-
 .../hbase/tool/Canary.RegionTask.TaskType.html  |    10 +-
 .../hadoop/hbase/tool/Canary.RegionTask.html    |    31 +-
 .../apache/hadoop/hbase/tool/Canary.Sink.html   |    19 +-
 .../hadoop/hbase/tool/Canary.StdOutSink.html    |    29 +-
 .../hbase/tool/Canary.ZookeeperMonitor.html     |    22 +-
 .../hbase/tool/Canary.ZookeeperStdOutSink.html  |    11 +-
 .../hadoop/hbase/tool/Canary.ZookeeperTask.html |    17 +-
 .../org/apache/hadoop/hbase/tool/Canary.html    |   231 +-
 .../hbase/tool/class-use/Canary.Monitor.html    |     8 +-
 .../class-use/Canary.RegionTask.TaskType.html   |    16 +-
 .../hbase/tool/class-use/Canary.Sink.html       |    78 +-
 .../hbase/tool/class-use/Canary.StdOutSink.html |    52 +-
 .../hadoop/hbase/tool/package-summary.html      |    44 +-
 .../apache/hadoop/hbase/tool/package-use.html   |    24 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    10 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../hbase/HConstants.OperationStatusCode.html   |   107 +-
 .../org/apache/hadoop/hbase/HConstants.html     |   107 +-
 .../org/apache/hadoop/hbase/Version.html        |     4 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |  4931 ++++----
 .../hadoop/hbase/regionserver/HStore.html       |  4931 ++++----
 .../compactions/Compactor.CellSinkFactory.html  |   596 +-
 .../compactions/Compactor.FileDetails.html      |   596 +-
 .../Compactor.InternalScannerFactory.html       |   596 +-
 .../regionserver/compactions/Compactor.html     |   596 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |  3033 ++---
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |  3033 ++---
 .../hbase/tool/Canary.RegionServerMonitor.html  |  3033 ++---
 .../tool/Canary.RegionServerStdOutSink.html     |  3033 ++---
 .../hbase/tool/Canary.RegionServerTask.html     |  3033 ++---
 .../hbase/tool/Canary.RegionStdOutSink.html     |  3033 ++---
 .../hbase/tool/Canary.RegionTask.TaskType.html  |  3033 ++---
 .../hadoop/hbase/tool/Canary.RegionTask.html    |  3033 ++---
 .../apache/hadoop/hbase/tool/Canary.Sink.html   |  3033 ++---
 .../hadoop/hbase/tool/Canary.StdOutSink.html    |  3033 ++---
 .../hbase/tool/Canary.ZookeeperMonitor.html     |  3033 ++---
 .../hbase/tool/Canary.ZookeeperStdOutSink.html  |  3033 ++---
 .../hadoop/hbase/tool/Canary.ZookeeperTask.html |  3033 ++---
 .../org/apache/hadoop/hbase/tool/Canary.html    |  3033 ++---
 downloads.html                                  |     4 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 .../TestChecksum.CorruptedFSReaderImpl.html     |    10 +-
 .../hadoop/hbase/io/hfile/TestChecksum.html     |     2 +-
 .../hfile/TestHFileBlock.BlockReaderThread.html |    16 +-
 .../hadoop/hbase/io/hfile/TestHFileBlock.html   |    24 +-
 .../hadoop/hbase/tool/TestCanaryTool.html       |    40 +-
 .../TestChecksum.CorruptedFSReaderImpl.html     |   196 +-
 .../hadoop/hbase/io/hfile/TestChecksum.html     |   196 +-
 .../hfile/TestHFileBlock.BlockReaderThread.html |  1013 +-
 .../hadoop/hbase/io/hfile/TestHFileBlock.html   |  1013 +-
 .../TestHFileBlockIndex.BlockReaderWrapper.html |     2 +-
 .../hbase/io/hfile/TestHFileBlockIndex.html     |     2 +-
 .../regionserver/CreateRandomStoreFile.html     |     2 +-
 .../hadoop/hbase/tool/TestCanaryTool.html       |   452 +-
 126 files changed, 35902 insertions(+), 35407 deletions(-)
----------------------------------------------------------------------


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


[07/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
index ce887a2..506bc5c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperTask.html
@@ -98,1529 +98,1560 @@
 <span class="sourceLineNo">090</span>import org.apache.hadoop.util.GenericOptionsParser;<a name="line.90"></a>
 <span class="sourceLineNo">091</span>import org.apache.hadoop.util.Tool;<a name="line.91"></a>
 <span class="sourceLineNo">092</span>import org.apache.hadoop.util.ToolRunner;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.zookeeper.KeeperException;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.zookeeper.ZooKeeper;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.zookeeper.data.Stat;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.slf4j.Logger;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.slf4j.LoggerFactory;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>/**<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * HBase Canary Tool, that that can be used to do<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
+<span class="sourceLineNo">093</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.zookeeper.KeeperException;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.zookeeper.ZooKeeper;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.zookeeper.client.ConnectStringParser;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.zookeeper.data.Stat;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.slf4j.Logger;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.slf4j.LoggerFactory;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * HBase Canary Tool for "canary monitoring" of a running HBase cluster.<a name="line.105"></a>
 <span class="sourceLineNo">106</span> *<a name="line.106"></a>
-<span class="sourceLineNo">107</span> * Here are three modes<a name="line.107"></a>
-<span class="sourceLineNo">108</span> * 1. region mode - Foreach region tries to get one row per column family<a name="line.108"></a>
-<span class="sourceLineNo">109</span> * and outputs some information about failure or latency.<a name="line.109"></a>
-<span class="sourceLineNo">110</span> *<a name="line.110"></a>
-<span class="sourceLineNo">111</span> * 2. regionserver mode - Foreach regionserver tries to get one row from one table<a name="line.111"></a>
-<span class="sourceLineNo">112</span> * selected randomly and outputs some information about failure or latency.<a name="line.112"></a>
-<span class="sourceLineNo">113</span> *<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * 3. zookeeper mode - for each zookeeper instance, selects a zNode and<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * outputs some information about failure or latency.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>@InterfaceAudience.Private<a name="line.117"></a>
-<span class="sourceLineNo">118</span>public final class Canary implements Tool {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // Sink interface used by the canary to outputs information<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public interface Sink {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    public long getReadFailureCount();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    public long incReadFailureCount();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public Map&lt;String,String&gt; getReadFailures();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void updateReadFailures(String regionName, String serverName);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    public long getWriteFailureCount();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    public long incWriteFailureCount();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    public Map&lt;String,String&gt; getWriteFailures();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    public void updateWriteFailures(String regionName, String serverName);<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>  // Simple implementation of canary sink that allows to plot on<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // file or standard output timings or failures.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static class StdOutSink implements Sink {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        writeFailureCount = new AtomicLong(0);<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    @Override<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    public long getReadFailureCount() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return readFailureCount.get();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>    @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public long incReadFailureCount() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return readFailureCount.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return readFailures;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      readFailures.put(regionName, serverName);<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 long getWriteFailureCount() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      return writeFailureCount.get();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    public long incWriteFailureCount() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      return writeFailureCount.incrementAndGet();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return writeFailures;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    @Override<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      writeFailures.put(regionName, serverName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>    public void publishReadFailure(String table, String server) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      incReadFailureCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.error(String.format("Read from table:%s on region server:%s", table, server));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">107</span> * There are three modes:<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * &lt;ol&gt;<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * &lt;li&gt;region mode (Default): For each region, try to get one row per column family outputting<a name="line.109"></a>
+<span class="sourceLineNo">110</span> * information on failure (ERROR) or else the latency.<a name="line.110"></a>
+<span class="sourceLineNo">111</span> * &lt;/li&gt;<a name="line.111"></a>
+<span class="sourceLineNo">112</span> *<a name="line.112"></a>
+<span class="sourceLineNo">113</span> * &lt;li&gt;regionserver mode: For each regionserver try to get one row from one table selected<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * randomly outputting information on failure (ERROR) or else the latency.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * &lt;/li&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> *<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * &lt;li&gt;zookeeper mode: for each zookeeper instance, selects a znode outputting information on<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * failure (ERROR) or else the latency.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * &lt;/li&gt;<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;/ol&gt;<a name="line.120"></a>
+<span class="sourceLineNo">121</span> */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>@InterfaceAudience.Private<a name="line.122"></a>
+<span class="sourceLineNo">123</span>public final class Canary implements Tool {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /**<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * Sink interface used by the canary to output information<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public interface Sink {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    long getReadFailureCount();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    long incReadFailureCount();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    Map&lt;String,String&gt; getReadFailures();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    void updateReadFailures(String regionName, String serverName);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    long getWriteFailureCount();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    long incWriteFailureCount();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Map&lt;String,String&gt; getWriteFailures();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    void updateWriteFailures(String regionName, String serverName);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * Simple implementation of canary sink that allows plotting to a file or standard output.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static class StdOutSink implements Sink {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    private AtomicLong readFailureCount = new AtomicLong(0),<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        writeFailureCount = new AtomicLong(0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    private Map&lt;String, String&gt; readFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    private Map&lt;String, String&gt; writeFailures = new ConcurrentHashMap&lt;&gt;();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getReadFailureCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return readFailureCount.get();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    public long incReadFailureCount() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      return readFailureCount.incrementAndGet();<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>    @Override<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    public Map&lt;String, String&gt; getReadFailures() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return readFailures;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void updateReadFailures(String regionName, String serverName) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      readFailures.put(regionName, serverName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>    @Override<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    public long getWriteFailureCount() {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      return writeFailureCount.get();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    public long incWriteFailureCount() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return writeFailureCount.incrementAndGet();<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>    @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    public Map&lt;String, String&gt; getWriteFailures() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      return writeFailures;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public void updateWriteFailures(String regionName, String serverName) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      writeFailures.put(regionName, serverName);<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>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      LOG.info(String.format("Read from table:%s on region server:%s in %dms",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          table, server, msTime));<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>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    public void publishReadFailure(String zNode, String server) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      incReadFailureCount();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.error(String.format("Read from zNode:%s on zookeeper instance:%s", zNode, server));<a name="line.198"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * By RegionServer, for 'regionserver' mode.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public static class RegionServerStdOutSink extends StdOutSink {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    public void publishReadFailure(String table, String server) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      incReadFailureCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      LOG.error("Read from {} on {}", table, server);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void publishReadTiming(String table, String server, long msTime) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      LOG.info("Read from {} on {} in {}ms", table, server, msTime);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      LOG.info(String.format("Read from zNode:%s on zookeeper instance:%s in %dms",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          znode, server, msTime));<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>  public static class RegionStdOutSink extends StdOutSink {<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private LongAdder writeLatency = new LongAdder();<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      incReadFailureCount();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      LOG.error(String.format("read from region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      incReadFailureCount();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      LOG.error(String.format("read from region %s on regionserver %s column family %s failed",<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), e);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></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>  /**<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * Output for 'zookeeper' mode.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static class ZookeeperStdOutSink extends StdOutSink {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    public void publishReadFailure(String znode, String server) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      incReadFailureCount();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.error("Read from {} on {}", znode, server);<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>    public void publishReadTiming(String znode, String server, long msTime) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      LOG.info("Read from {} on {} in {}ms", znode, server, msTime);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * By Region, for 'region'  mode.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public static class RegionStdOutSink extends StdOutSink {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private Map&lt;String, LongAdder&gt; perTableReadLatency = new HashMap&lt;&gt;();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    private LongAdder writeLatency = new LongAdder();<a name="line.221"></a>
 <span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public void publishReadTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      LOG.info(String.format("read from region %s on regionserver %s column family %s in %dms",<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.225"></a>
+<span class="sourceLineNo">223</span>    public void publishReadFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      incReadFailureCount();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      LOG.error("Read from {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    }<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      incWriteFailureCount();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.error(String.format("write to region %s on regionserver %s failed", region.getRegionNameAsString(), serverName), e);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, Exception e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      incWriteFailureCount();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      LOG.error(String.format("write to region %s on regionserver %s column family %s failed",<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        region.getRegionNameAsString(), serverName, column.getNameAsString()), 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>    public void publishWriteTiming(ServerName serverName, RegionInfo region, ColumnFamilyDescriptor column, long msTime) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      LOG.info(String.format("write to region %s on regionserver %s column family %s in %dms",<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime));<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return this.perTableReadLatency;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      LongAdder initLatency = new LongAdder();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      return initLatency;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void initializeWriteLatency() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      this.writeLatency.reset();<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>    public LongAdder getWriteLatency() {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      return this.writeLatency;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">228</span>    public void publishReadFailure(ServerName serverName, RegionInfo region,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      incReadFailureCount();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      LOG.error("Read from {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          column.getNameAsString(), e);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>    public void publishReadTiming(ServerName serverName, RegionInfo region,<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      LOG.info("Read from {} on {} {} in {}ms", region.getRegionNameAsString(), serverName,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>          column.getNameAsString(), msTime);<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>    public void publishWriteFailure(ServerName serverName, RegionInfo region, Exception e) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      incWriteFailureCount();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      LOG.error("Write to {} on {} failed", region.getRegionNameAsString(), serverName, e);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>    public void publishWriteFailure(ServerName serverName, RegionInfo region,<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        ColumnFamilyDescriptor column, Exception e) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      incWriteFailureCount();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.error("Write to {} on {} {} failed", region.getRegionNameAsString(), serverName,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          column.getNameAsString(), e);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    public void publishWriteTiming(ServerName serverName, RegionInfo region,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        ColumnFamilyDescriptor column, long msTime) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      LOG.info("Write to {} on {} {} in {}ms",<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        region.getRegionNameAsString(), serverName, column.getNameAsString(), msTime);<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>    public Map&lt;String, LongAdder&gt; getReadLatencyMap() {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return this.perTableReadLatency;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
 <span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    private final Connection connection;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    private final String host;<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    private String znode;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    private final int timeout;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    private ZookeeperStdOutSink sink;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        ZookeeperStdOutSink sink) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      this.connection = connection;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      this.host = host;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      this.znode = znode;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      this.timeout = timeout;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.sink = sink;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>    @Override public Void call() throws Exception {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      ZooKeeper zooKeeper = null;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      try {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        StopWatch stopwatch = new StopWatch();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        stopwatch.start();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        zooKeeper.getData(znode, false, exists);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        stopwatch.stop();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      } catch (KeeperException | InterruptedException e) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        sink.publishReadFailure(znode, host);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      } finally {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (zooKeeper != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          zooKeeper.close();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      return null;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * For each column family of the region tries to get one row and outputs the latency, or the<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * failure.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    public enum TaskType{<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      READ, WRITE<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    private Connection connection;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    private RegionInfo region;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    private RegionStdOutSink sink;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    private TaskType taskType;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    private boolean rawScanEnabled;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    private ServerName serverName;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    private LongAdder readWriteLatency;<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName, RegionStdOutSink sink,<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      this.connection = connection;<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      this.region = region;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      this.serverName = serverName;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      this.sink = sink;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.taskType = taskType;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.readWriteLatency = rwLatency;<a name="line.324"></a>
+<span class="sourceLineNo">263</span>    public LongAdder initializeAndGetReadLatencyForTable(String tableName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      LongAdder initLatency = new LongAdder();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      this.perTableReadLatency.put(tableName, initLatency);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return initLatency;<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>    public void initializeWriteLatency() {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      this.writeLatency.reset();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    public LongAdder getWriteLatency() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      return this.writeLatency;<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Run a single zookeeper Task and then exit.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  static class ZookeeperTask implements Callable&lt;Void&gt; {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    private final Connection connection;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    private final String host;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    private String znode;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    private final int timeout;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private ZookeeperStdOutSink sink;<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>    public ZookeeperTask(Connection connection, String host, String znode, int timeout,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        ZookeeperStdOutSink sink) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.connection = connection;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      this.host = host;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      this.znode = znode;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      this.timeout = timeout;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      this.sink = sink;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override public Void call() throws Exception {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      ZooKeeper zooKeeper = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        zooKeeper = new ZooKeeper(host, timeout, EmptyWatcher.instance);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        Stat exists = zooKeeper.exists(znode, false);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        StopWatch stopwatch = new StopWatch();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        stopwatch.start();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        zooKeeper.getData(znode, false, exists);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        stopwatch.stop();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        sink.publishReadTiming(znode, host, stopwatch.getTime());<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      } catch (KeeperException | InterruptedException e) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        sink.publishReadFailure(znode, host);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        if (zooKeeper != null) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          zooKeeper.close();<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>      return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  /**<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * Run a single Region Task and then exit. For each column family of the Region, get one row and<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * output latency or failure.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  static class RegionTask implements Callable&lt;Void&gt; {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    public enum TaskType{<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      READ, WRITE<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>    @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    public Void call() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      switch (taskType) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      case READ:<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        return read();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      case WRITE:<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        return write();<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      default:<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return read();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    public Void read() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Table table = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      TableDescriptor tableDesc = null;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        if (LOG.isDebugEnabled()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          LOG.debug(String.format("reading table descriptor for table %s",<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            region.getTable()));<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        table = connection.getTable(region.getTable());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        tableDesc = table.getDescriptor();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      } catch (IOException e) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        LOG.debug("sniffRegion failed", e);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        sink.publishReadFailure(serverName, region, e);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (table != null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          try {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            table.close();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>          } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            LOG.error("Close table failed", e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        return null;<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>      byte[] startKey = null;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      Get get = null;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Scan scan = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      ResultScanner rs = null;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      StopWatch stopWatch = new StopWatch();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        stopWatch.reset();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        startKey = region.getStartKey();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (startKey.length &gt; 0) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          get = new Get(startKey);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          get.setCacheBlocks(false);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          get.addFamily(column.getName());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          scan = new Scan();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if (LOG.isDebugEnabled()) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            LOG.debug(String.format("rawScan : %s for table: %s", rawScanEnabled,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>              tableDesc.getTableName()));<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          scan.setRaw(rawScanEnabled);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          scan.setCaching(1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          scan.setCacheBlocks(false);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          scan.addFamily(column.getName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          scan.setMaxResultSize(1L);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          scan.setOneRowLimit();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug(String.format("reading from table %s region %s column family %s and key %s",<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            Bytes.toStringBinary(startKey)));<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          stopWatch.start();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          if (startKey.length &gt; 0) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            table.get(get);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            rs = table.getScanner(scan);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            rs.next();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          stopWatch.stop();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        } catch (Exception e) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } finally {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          if (rs != null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            rs.close();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          scan = null;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          get = null;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      try {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        table.close();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      } catch (IOException e) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.error("Close table failed", e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return null;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>     * Check writes for the canary table<a name="line.427"></a>
-<span class="sourceLineNo">428</span>     * @return<a name="line.428"></a>
-<span class="sourceLineNo">429</span>     */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    private Void write() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      Table table = null;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      TableDescriptor tableDesc = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      try {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        table = connection.getTable(region.getTable());<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        tableDesc = table.getDescriptor();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        byte[] rowToCheck = region.getStartKey();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        if (rowToCheck.length == 0) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          rowToCheck = new byte[]{0x0};<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        int writeValueSize =<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          Put put = new Put(rowToCheck);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          byte[] value = new byte[writeValueSize];<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          Bytes.random(value);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>          if (LOG.isDebugEnabled()) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            LOG.debug(String.format("writing to table %s region %s column family %s and key %s",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>              tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toStringBinary(rowToCheck)));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          }<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          try {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            long startTime = System.currentTimeMillis();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            table.put(put);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            long time = System.currentTimeMillis() - startTime;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            this.readWriteLatency.add(time);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          } catch (Exception e) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            sink.publishWriteFailure(serverName, region, column, e);<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>        table.close();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      } catch (IOException e) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * Get one row from a region on the regionserver and outputs the latency, or the failure.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    private Connection connection;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    private String serverName;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    private RegionInfo region;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    private RegionServerStdOutSink sink;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    private AtomicLong successes;<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      this.connection = connection;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      this.serverName = serverName;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this.region = region;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      this.sink = sink;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      this.successes = successes;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    public Void call() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      TableName tableName = null;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      Table table = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      Get get = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      byte[] startKey = null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      Scan scan = null;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      StopWatch stopWatch = new StopWatch();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // monitor one region on every region server<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      stopWatch.reset();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        tableName = region.getTable();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        table = connection.getTable(tableName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        startKey = region.getStartKey();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        if (LOG.isDebugEnabled()) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          LOG.debug(String.format("reading from region server %s table %s region %s and key %s",<a name="line.507"></a>
-<span class="sourceLineNo">508</span>            serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>            Bytes.toStringBinary(startKey)));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        if (startKey.length &gt; 0) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          get = new Get(startKey);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          get.setCacheBlocks(false);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          stopWatch.start();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>          table.get(get);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          stopWatch.stop();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        } else {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          scan = new Scan();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          scan.setCacheBlocks(false);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          scan.setCaching(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          scan.setMaxResultSize(1L);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          scan.setOneRowLimit();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          stopWatch.start();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          ResultScanner s = table.getScanner(scan);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          s.next();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          s.close();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          stopWatch.stop();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        successes.incrementAndGet();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      } catch (TableNotFoundException tnfe) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        LOG.error("Table may be deleted", tnfe);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (TableNotEnabledException tnee) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        // This is considered a success since we got a response.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        successes.incrementAndGet();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.debug("The targeted table was disabled.  Assuming success.");<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      } catch (DoNotRetryIOException dnrioe) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.error(dnrioe.toString(), dnrioe);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      } catch (IOException e) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        sink.publishReadFailure(tableName.getNameAsString(), serverName);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        LOG.error(e.toString(), e);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        if (table != null) {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>            table.close();<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          } catch (IOException e) {/* DO NOTHING */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>            LOG.error("Close table failed", e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          }<a name="line.552"></a>
-<span class="sourceLineNo">553</span>        }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>        scan = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        get = null;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        startKey = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  private static final int USAGE_EXIT_CODE = 1;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  private static final int INIT_ERROR_EXIT_CODE = 2;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private static final int TIMEOUT_ERROR_EXIT_CODE = 3;<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  private static final int ERROR_EXIT_CODE = 4;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static final int FAILURE_EXIT_CODE = 5;<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  private static final long DEFAULT_INTERVAL = 60000;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>  private static final long DEFAULT_TIMEOUT = 600000; // 10 mins<a name="line.570"></a>
-<span class="sourceLineNo">571</span>  private static final int MAX_THREADS_NUM = 16; // #threads to contact regions<a name="line.571"></a>
+<span class="sourceLineNo">326</span>    private Connection connection;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    private RegionInfo region;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    private RegionStdOutSink sink;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    private TaskType taskType;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    private boolean rawScanEnabled;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    private ServerName serverName;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    private LongAdder readWriteLatency;<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    RegionTask(Connection connection, RegionInfo region, ServerName serverName,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        RegionStdOutSink sink, TaskType taskType, boolean rawScanEnabled, LongAdder rwLatency) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      this.connection = connection;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      this.region = region;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      this.serverName = serverName;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      this.sink = sink;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.taskType = taskType;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      this.rawScanEnabled = rawScanEnabled;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      this.readWriteLatency = rwLatency;<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    public Void call() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      switch (taskType) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      case READ:<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return read();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      case WRITE:<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        return write();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      default:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return read();<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Void read() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Table table = null;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      TableDescriptor tableDesc = null;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        LOG.debug("Reading table descriptor for table {}", region.getTable());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        table = connection.getTable(region.getTable());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        tableDesc = table.getDescriptor();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.debug("sniffRegion {} of {} failed", region.getEncodedName(), e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        sink.publishReadFailure(serverName, region, e);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        if (table != null) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          try {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            table.close();<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (IOException ioe) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            LOG.error("Close table failed", e);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      byte[] startKey = null;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Get get = null;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      Scan scan = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      ResultScanner rs = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      StopWatch stopWatch = new StopWatch();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        stopWatch.reset();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        startKey = region.getStartKey();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if (startKey.length &gt; 0) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          get = new Get(startKey);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          get.setCacheBlocks(false);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          get.addFamily(column.getName());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        } else {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          scan = new Scan();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          LOG.debug("rawScan {} for {}", rawScanEnabled, tableDesc.getTableName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          scan.setRaw(rawScanEnabled);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          scan.setCaching(1);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          scan.setCacheBlocks(false);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          scan.addFamily(column.getName());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          scan.setMaxResultSize(1L);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>          scan.setOneRowLimit();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        LOG.debug("Reading from {} {} {} {}", tableDesc.getTableName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            region.getRegionNameAsString(), column.getNameAsString(),<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            Bytes.toStringBinary(startKey));<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          stopWatch.start();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          if (startKey.length &gt; 0) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            table.get(get);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            rs = table.getScanner(scan);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            rs.next();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          stopWatch.stop();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>          this.readWriteLatency.add(stopWatch.getTime());<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          sink.publishReadTiming(serverName, region, column, stopWatch.getTime());<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (Exception e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          sink.publishReadFailure(serverName, region, column, e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          sink.updateReadFailures(region.getRegionNameAsString(), serverName.getHostname());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          if (rs != null) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>            rs.close();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          scan = null;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          get = null;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        table.close();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        LOG.error("Close table failed", e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      return null;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>    /**<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     * Check writes for the canary table<a name="line.436"></a>
+<span class="sourceLineNo">437</span>     */<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    private Void write() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Table table = null;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      TableDescriptor tableDesc = null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      try {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        table = connection.getTable(region.getTable());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        tableDesc = table.getDescriptor();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        byte[] rowToCheck = region.getStartKey();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        if (rowToCheck.length == 0) {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          rowToCheck = new byte[]{0x0};<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        }<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        int writeValueSize =<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            connection.getConfiguration().getInt(HConstants.HBASE_CANARY_WRITE_VALUE_SIZE_KEY, 10);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        for (ColumnFamilyDescriptor column : tableDesc.getColumnFamilies()) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          Put put = new Put(rowToCheck);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          byte[] value = new byte[writeValueSize];<a name="line.452"></a>
+<span class="sourceLineNo">453</span>          Bytes.random(value);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>          put.addColumn(column.getName(), HConstants.EMPTY_BYTE_ARRAY, value);<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>          LOG.debug("Writing to {} {} {} {}",<a name="line.456"></a>
+<span class="sourceLineNo">457</span>            tableDesc.getTableName(), region.getRegionNameAsString(), column.getNameAsString(),<a name="line.457"></a>
+<span class="sourceLineNo">458</span>            Bytes.toStringBinary(rowToCheck));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          try {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            long startTime = System.currentTimeMillis();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            table.put(put);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            long time = System.currentTimeMillis() - startTime;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            this.readWriteLatency.add(time);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            sink.publishWriteTiming(serverName, region, column, time);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          } catch (Exception e) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            sink.publishWriteFailure(serverName, region, column, e);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        table.close();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      } catch (IOException e) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        sink.publishWriteFailure(serverName, region, e);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>        sink.updateWriteFailures(region.getRegionNameAsString(), serverName.getHostname() );<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      return null;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  /**<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * Run a single RegionServer Task and then exit.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * Get one row from a region on the regionserver and output latency or the failure.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  static class RegionServerTask implements Callable&lt;Void&gt; {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    private Connection connection;<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    private String serverName;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    private RegionInfo region;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    private RegionServerStdOutSink sink;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    private AtomicLong successes;<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>    RegionServerTask(Connection connection, String serverName, RegionInfo region,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        RegionServerStdOutSink sink, AtomicLong successes) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      this.connection = connection;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      this.serverName = serverName;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      this.region = region;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      this.sink = sink;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      this.successes = successes;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    public Void call() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      TableName tableName = null;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      Table table = null;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      Get get = null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      byte[] startKey = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      Scan scan = null;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      StopWatch stopWatch = new StopWatch();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      // monitor one region on every region server<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      stopWatch.reset();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      try {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        tableName = region.getTable();<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        table = connection.getTable(tableName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        startKey = region.getStartKey();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        // Can't do a get on empty start row so do a Scan of first element if any instead.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.debug("Reading from {} {} {} {}",<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          serverName, region.getTable(), region.getRegionNameAsString(),<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          Bytes.toStringBinary(startKey));<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (startKey.length &gt; 0) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          get = new Get(startKey);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          get.setCacheBlocks(false);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          get.setFilter(new FirstKeyOnlyFilter());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          stopWatch.start();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>          table.get(get);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>          stopWatch.stop();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        } else {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          scan = new Scan();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          scan.setCacheBlocks(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          scan.setFilter(new FirstKeyOnlyFilter());<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          scan.setCaching(1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          scan.setMaxResultSize(1L);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          scan.setOneRowLimit();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          stopWatch.start();<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          ResultScanner s = table.getScanner(scan);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          s.next();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          s.close();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          stopWatch.stop();<a name="line.534"></a>
+<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        successes.incrementAndGet();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        sink.publishReadTiming(tableName.getNameAsString(), serverName, stopWatch.getTime());<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (TableNotFoundException tnfe) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.error("Table may be deleted", tnfe);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        // This is ignored because it doesn't imply that the regionserver is dead<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      } catch (TableNotEnabledException tnee) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        // This is considered a success since we got a response.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>        successes.incrementAndGet();<a name="line.543"></a>
+<span class

<TRUNCATED>

[29/35] hbase-site git commit: Published site at 8cc56bd18c40ba9a7131336e97c74f8d97d8b2be.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html b/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
index d9386cf..d8b2610 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.229">Compactor.InternalScannerFactory</a></pre>
+<pre>protected static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.231">Compactor.InternalScannerFactory</a></pre>
 </li>
 </ul>
 </div>
@@ -161,7 +161,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanType</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html#line.231">getScanType</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html#line.233">getScanType</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request)</pre>
 </li>
 </ul>
 <a name="createScanner-org.apache.hadoop.hbase.regionserver.ScanInfo-java.util.List-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.Compactor.FileDetails-long-">
@@ -170,7 +170,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createScanner</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html#line.233">createScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
+<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html#line.235">createScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;scanners,
                               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanType</a>&nbsp;scanType,
                               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">Compactor.FileDetails</a>&nbsp;fd,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html b/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
index bdf4a73..aa66384 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html
@@ -496,7 +496,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>defaultScannerFactory</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">Compactor.InternalScannerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.237">defaultScannerFactory</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">Compactor.InternalScannerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.239">defaultScannerFactory</a></pre>
 </li>
 </ul>
 </li>
@@ -561,7 +561,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createFileScanners</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.219">createFileScanners</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToCompact,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.221">createFileScanners</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesToCompact,
                                                   long&nbsp;smallestReadPoint,
                                                   boolean&nbsp;useDropBehind)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -582,7 +582,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSmallestReadPoint</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.225">getSmallestReadPoint</a>()</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.227">getSmallestReadPoint</a>()</pre>
 </li>
 </ul>
 <a name="createTmpWriter-org.apache.hadoop.hbase.regionserver.compactions.Compactor.FileDetails-boolean-">
@@ -591,7 +591,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createTmpWriter</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.258">createTmpWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">Compactor.FileDetails</a>&nbsp;fd,
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.260">createTmpWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">Compactor.FileDetails</a>&nbsp;fd,
                                                 boolean&nbsp;shouldDropBehind)
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Creates a writer for a new file in a temporary directory.</div>
@@ -611,7 +611,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>preCompactScannerOpen</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.266">preCompactScannerOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.268">preCompactScannerOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request,
                                        <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanType</a>&nbsp;scanType,
                                        <a href="../../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -627,7 +627,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>postCompactScannerOpen</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.282">postCompactScannerOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.284">postCompactScannerOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request,
                                                <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanType</a>&nbsp;scanType,
                                                <a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;scanner,
                                                <a href="../../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
@@ -651,7 +651,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compact</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.291">compact</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request,
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.293">compact</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request,
                                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.InternalScannerFactory.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">Compactor.InternalScannerFactory</a>&nbsp;scannerFactory,
                                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.CellSinkFactory.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">Compactor.CellSinkFactory</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.html" title="type parameter in Compactor">T</a>&gt;&nbsp;sinkFactory,
                                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.html" title="interface in org.apache.hadoop.hbase.regionserver.throttle">ThroughputController</a>&nbsp;throughputController,
@@ -671,7 +671,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>commitWriter</h4>
-<pre>protected abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.342">commitWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.html" title="type parameter in Compactor">T</a>&nbsp;writer,
+<pre>protected abstract&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.344">commitWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.html" title="type parameter in Compactor">T</a>&nbsp;writer,
                                                                 <a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">Compactor.FileDetails</a>&nbsp;fd,
                                                                 <a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;request)
                                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -689,7 +689,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>abortWriter</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.345">abortWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.html" title="type parameter in Compactor">T</a>&nbsp;writer)
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.347">abortWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.html" title="type parameter in Compactor">T</a>&nbsp;writer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -703,7 +703,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>performCompaction</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.359">performCompaction</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">Compactor.FileDetails</a>&nbsp;fd,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.361">performCompaction</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/compactions/Compactor.FileDetails.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">Compactor.FileDetails</a>&nbsp;fd,
                                     <a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;scanner,
                                     <a href="../../../../../../org/apache/hadoop/hbase/regionserver/CellSink.html" title="interface in org.apache.hadoop.hbase.regionserver">CellSink</a>&nbsp;writer,
                                     long&nbsp;smallestReadPoint,
@@ -736,7 +736,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createScanner</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.481">createScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.483">createScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;scanners,
                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanType</a>&nbsp;scanType,
@@ -763,7 +763,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createScanner</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.496">createScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/compactions/Compactor.html#line.498">createScanner</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreFileScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileScanner</a>&gt;&nbsp;scanners,
                                         long&nbsp;smallestReadPoint,

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index cd3870f..30c4e73 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -207,8 +207,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 </ul>
 </li>
 </ul>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 4ade4c1..2923faf 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -199,9 +199,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
index fd0c419..6fd8a31 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -121,9 +121,10 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.929">Canary.Monitor</a>
+<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.976">Canary.Monitor</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
+<div class="block">A Monitor super-class can be extended by users</div>
 </li>
 </ul>
 </div>
@@ -176,7 +177,9 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html#targets">targets</a></span></code>
+<div class="block">'Target' dependent on 'mode'.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
@@ -278,7 +281,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.931">connection</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.977">connection</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -287,7 +290,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>admin</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.932">admin</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.978">admin</a></pre>
 </li>
 </ul>
 <a name="targets">
@@ -296,7 +299,9 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>targets</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.933">targets</a></pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.983">targets</a></pre>
+<div class="block">'Target' dependent on 'mode'. Could be Tables or RegionServers or ZNodes.
+ Passed on the command-line as arguments.</div>
 </li>
 </ul>
 <a name="useRegExp">
@@ -305,7 +310,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>useRegExp</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.934">useRegExp</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.984">useRegExp</a></pre>
 </li>
 </ul>
 <a name="treatFailureAsError">
@@ -314,7 +319,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>treatFailureAsError</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.935">treatFailureAsError</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.985">treatFailureAsError</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -323,7 +328,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.936">initialized</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.986">initialized</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -332,7 +337,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.938">done</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.988">done</a></pre>
 </li>
 </ul>
 <a name="errorCode">
@@ -341,7 +346,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>errorCode</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.939">errorCode</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.989">errorCode</a></pre>
 </li>
 </ul>
 <a name="allowedFailures">
@@ -350,7 +355,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>allowedFailures</h4>
-<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.940">allowedFailures</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.990">allowedFailures</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -359,7 +364,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.941">sink</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.991">sink</a></pre>
 </li>
 </ul>
 <a name="executor">
@@ -368,7 +373,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executor</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.942">executor</a></pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.992">executor</a></pre>
 </li>
 </ul>
 </li>
@@ -385,7 +390,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Monitor</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.970">Monitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.1020">Monitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                   boolean&nbsp;useRegExp,
                   <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
@@ -408,7 +413,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>isDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.944">isDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.994">isDone</a>()</pre>
 </li>
 </ul>
 <a name="hasError--">
@@ -417,7 +422,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>hasError</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.948">hasError</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.998">hasError</a>()</pre>
 </li>
 </ul>
 <a name="finalCheckForErrors--">
@@ -426,7 +431,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>finalCheckForErrors</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.952">finalCheckForErrors</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.1002">finalCheckForErrors</a>()</pre>
 </li>
 </ul>
 <a name="close--">
@@ -435,7 +440,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.966">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.1016">close</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -453,7 +458,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.984">run</a>()</pre>
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.1034">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -466,7 +471,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>initAdmin</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.986">initAdmin</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.1036">initAdmin</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/713132a3/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
index 848918e..e9875c5 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
@@ -122,8 +122,9 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1003">Canary.RegionMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1055">Canary.RegionMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
+<div class="block">A monitor for region mode.</div>
 </li>
 </ul>
 </div>
@@ -148,7 +149,9 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#configuredReadTableTimeouts">configuredReadTableTimeouts</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#configuredReadTableTimeouts">configuredReadTableTimeouts</a></span></code>
+<div class="block">This is a timeout per table.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
@@ -212,10 +215,10 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">RegionMonitor</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
              boolean&nbsp;useRegExp,
-             <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+             <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
              boolean&nbsp;writeSniffing,
              <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
@@ -299,7 +302,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_TABLE_CHECK_PERIOD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1005">DEFAULT_WRITE_TABLE_CHECK_PERIOD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1057">DEFAULT_WRITE_TABLE_CHECK_PERIOD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.RegionMonitor.DEFAULT_WRITE_TABLE_CHECK_PERIOD">Constant Field Values</a></dd>
@@ -312,7 +315,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_DATA_TTL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1007">DEFAULT_WRITE_DATA_TTL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1059">DEFAULT_WRITE_DATA_TTL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.RegionMonitor.DEFAULT_WRITE_DATA_TTL">Constant Field Values</a></dd>
@@ -325,7 +328,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lastCheckTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1009">lastCheckTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1061">lastCheckTime</a></pre>
 </li>
 </ul>
 <a name="writeSniffing">
@@ -334,7 +337,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSniffing</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1010">writeSniffing</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1062">writeSniffing</a></pre>
 </li>
 </ul>
 <a name="writeTableName">
@@ -343,7 +346,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTableName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1011">writeTableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1063">writeTableName</a></pre>
 </li>
 </ul>
 <a name="writeDataTTL">
@@ -352,7 +355,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeDataTTL</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1012">writeDataTTL</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1064">writeDataTTL</a></pre>
 </li>
 </ul>
 <a name="regionsLowerLimit">
@@ -361,7 +364,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsLowerLimit</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1013">regionsLowerLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1065">regionsLowerLimit</a></pre>
 </li>
 </ul>
 <a name="regionsUpperLimit">
@@ -370,7 +373,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsUpperLimit</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1014">regionsUpperLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1066">regionsUpperLimit</a></pre>
 </li>
 </ul>
 <a name="checkPeriod">
@@ -379,7 +382,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkPeriod</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1015">checkPeriod</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1067">checkPeriod</a></pre>
 </li>
 </ul>
 <a name="rawScanEnabled">
@@ -388,7 +391,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>rawScanEnabled</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1016">rawScanEnabled</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1068">rawScanEnabled</a></pre>
 </li>
 </ul>
 <a name="configuredReadTableTimeouts">
@@ -397,7 +400,9 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>configuredReadTableTimeouts</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1017">configuredReadTableTimeouts</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1074">configuredReadTableTimeouts</a></pre>
+<div class="block">This is a timeout per table. If read of each region in the table aggregated takes longer
+ than what is configured here, we log an ERROR rather than just an INFO.</div>
 </li>
 </ul>
 <a name="configuredWriteTableTimeout">
@@ -406,7 +411,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>configuredWriteTableTimeout</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1018">configuredWriteTableTimeout</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1076">configuredWriteTableTimeout</a></pre>
 </li>
 </ul>
 </li>
@@ -417,16 +422,16 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.StdOutSink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">
+<a name="RegionMonitor-org.apache.hadoop.hbase.client.Connection-java.lang.String:A-boolean-org.apache.hadoop.hbase.tool.Canary.Sink-java.util.concurrent.ExecutorService-boolean-org.apache.hadoop.hbase.TableName-boolean-java.util.HashMap-long-long-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1020">RegionMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1078">RegionMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                      boolean&nbsp;useRegExp,
-                     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a>&nbsp;sink,
+                     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
                      boolean&nbsp;writeSniffing,
                      <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;writeTableName,
@@ -450,7 +455,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1042">getSink</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1102">getSink</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -459,7 +464,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1050">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1110">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -474,9 +479,11 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>generateMonitorTables</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1131">generateMonitorTables</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1200">generateMonitorTables</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>List of tables to use in test.</dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
@@ -488,7 +495,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1177">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1244">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType,
                                  <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a>&nbsp;regionSink)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
@@ -503,7 +510,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkWriteTableDistribution</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1192">checkWriteTableDistribution</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1260">checkWriteTableDistribution</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -517,7 +524,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createWriteTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1232">createWriteTable</a>(int&nbsp;numberOfServers)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1300">createWriteTable</a>(int&nbsp;numberOfServers)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>