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/03/31 14:48:09 UTC

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

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 424223a80 -> 839437eec


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.html
index 1c5ace7..b8afbb7 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.html
@@ -66,858 +66,885 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.util.test.LoadTestDataGenerator;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.test.LoadTestDataGeneratorWithACL;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.util.ToolRunner;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * A command-line utility that reads, writes, and verifies data. Unlike<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * {@link org.apache.hadoop.hbase.PerformanceEvaluation}, this tool validates the data written,<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * and supports simultaneously writing and reading the same set of keys.<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class LoadTestTool extends AbstractHBaseTool {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(LoadTestTool.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static final String COLON = ":";<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  /** Table name for the test */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private TableName tableName;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  /** Column families for the test */<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private byte[][] families;<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  /** Table name to use of not overridden on the command line */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  protected static final String DEFAULT_TABLE_NAME = "cluster_test";<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  /** The default data size if not specified */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  protected static final int DEFAULT_DATA_SIZE = 64;<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /** The number of reader/writer threads if not specified */<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  protected static final int DEFAULT_NUM_THREADS = 20;<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  /** Usage string for the load option */<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  protected static final String OPT_USAGE_LOAD =<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      "&lt;avg_cols_per_key&gt;:&lt;avg_data_size&gt;" +<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      "[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  /** Usage string for the read option */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  protected static final String OPT_USAGE_READ =<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      "&lt;verify_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  /** Usage string for the update option */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  protected static final String OPT_USAGE_UPDATE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      "&lt;update_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      + "&gt;][:&lt;#whether to ignore nonce collisions=0&gt;]";<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  protected static final String OPT_USAGE_BLOOM = "Bloom filter type, one of " +<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      Arrays.toString(BloomType.values());<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  protected static final String OPT_USAGE_COMPRESSION = "Compression type, " +<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      "one of " + Arrays.toString(Compression.Algorithm.values());<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public static final String OPT_BLOOM = "bloom";<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static final String OPT_COMPRESSION = "compression";<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public static final String OPT_DEFERRED_LOG_FLUSH = "deferredlogflush";<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static final String OPT_DEFERRED_LOG_FLUSH_USAGE = "Enable deferred log flush.";<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public static final String OPT_INMEMORY = "in_memory";<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public static final String OPT_USAGE_IN_MEMORY = "Tries to keep the HFiles of the CF " +<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "inmemory as far as possible.  Not guaranteed that reads are always served from inmemory";<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  public static final String OPT_GENERATOR = "generator";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  public static final String OPT_GENERATOR_USAGE = "The class which generates load for the tool."<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      + " Any args for this class can be passed as colon separated after class name";<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public static final String OPT_WRITER = "writer";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public static final String OPT_WRITER_USAGE = "The class for executing the write requests";<a name="line.123"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.AlreadySelectedException;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.DefaultParser;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.MissingOptionException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.Options;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.ParseException;<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>/**<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * A command-line utility that reads, writes, and verifies data. Unlike<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * {@link org.apache.hadoop.hbase.PerformanceEvaluation}, this tool validates the data written,<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * and supports simultaneously writing and reading the same set of keys.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.75"></a>
+<span class="sourceLineNo">076</span>public class LoadTestTool extends AbstractHBaseTool {<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static final Logger LOG = LoggerFactory.getLogger(LoadTestTool.class);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static final String COLON = ":";<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  /** Table name for the test */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private TableName tableName;<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  /** Column families for the test */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private byte[][] families;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  /** Table name to use of not overridden on the command line */<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected static final String DEFAULT_TABLE_NAME = "cluster_test";<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /** The default data size if not specified */<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  protected static final int DEFAULT_DATA_SIZE = 64;<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  /** The number of reader/writer threads if not specified */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  protected static final int DEFAULT_NUM_THREADS = 20;<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  /** Usage string for the load option */<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected static final String OPT_USAGE_LOAD =<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      "&lt;avg_cols_per_key&gt;:&lt;avg_data_size&gt;" +<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      "[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  /** Usage string for the read option */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  protected static final String OPT_USAGE_READ =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      "&lt;verify_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  /** Usage string for the update option */<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  protected static final String OPT_USAGE_UPDATE =<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      "&lt;update_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      + "&gt;][:&lt;#whether to ignore nonce collisions=0&gt;]";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final String OPT_USAGE_BLOOM = "Bloom filter type, one of " +<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      Arrays.toString(BloomType.values());<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  protected static final String OPT_USAGE_COMPRESSION = "Compression type, " +<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      "one of " + Arrays.toString(Compression.Algorithm.values());<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public static final String OPT_BLOOM = "bloom";<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  public static final String OPT_COMPRESSION = "compression";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public static final String OPT_DEFERRED_LOG_FLUSH = "deferredlogflush";<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  public static final String OPT_DEFERRED_LOG_FLUSH_USAGE = "Enable deferred log flush.";<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public static final String OPT_INMEMORY = "in_memory";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final String OPT_USAGE_IN_MEMORY = "Tries to keep the HFiles of the CF " +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "inmemory as far as possible.  Not guaranteed that reads are always served from inmemory";<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static final String OPT_UPDATER = "updater";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static final String OPT_UPDATER_USAGE = "The class for executing the update requests";<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public static final String OPT_READER = "reader";<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public static final String OPT_READER_USAGE = "The class for executing the read requests";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final String OPT_KEY_WINDOW = "key_window";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  protected static final String OPT_WRITE = "write";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  protected static final String OPT_MAX_READ_ERRORS = "max_read_errors";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  public static final String OPT_MULTIPUT = "multiput";<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static final String OPT_MULTIGET = "multiget_batchsize";<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  protected static final String OPT_NUM_KEYS = "num_keys";<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  protected static final String OPT_READ = "read";<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  protected static final String OPT_START_KEY = "start_key";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public static final String OPT_TABLE_NAME = "tn";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String OPT_COLUMN_FAMILIES = "families";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  protected static final String OPT_ZK_QUORUM = "zk";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  protected static final String OPT_ZK_PARENT_NODE = "zk_root";<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  protected static final String OPT_SKIP_INIT = "skip_init";<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  protected static final String OPT_INIT_ONLY = "init_only";<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  protected static final String NUM_TABLES = "num_tables";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  protected static final String OPT_BATCHUPDATE = "batchupdate";<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  protected static final String OPT_UPDATE = "update";<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  public static final String OPT_ENCRYPTION = "encryption";<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected static final String OPT_ENCRYPTION_USAGE =<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    "Enables transparent encryption on the test table, one of " +<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    Arrays.toString(Encryption.getSupportedCiphers());<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static final String OPT_NUM_REGIONS_PER_SERVER = "num_regions_per_server";<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  protected static final String OPT_NUM_REGIONS_PER_SERVER_USAGE<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    = "Desired number of regions per region server. Defaults to 5.";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static int DEFAULT_NUM_REGIONS_PER_SERVER = 5;<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  public static final String OPT_REGION_REPLICATION = "region_replication";<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  protected static final String OPT_REGION_REPLICATION_USAGE =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      "Desired number of replicas per region";<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final String OPT_REGION_REPLICA_ID = "region_replica_id";<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  protected static final String OPT_REGION_REPLICA_ID_USAGE =<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      "Region replica id to do the reads from";<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public static final String OPT_MOB_THRESHOLD = "mob_threshold";<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  protected static final String OPT_MOB_THRESHOLD_USAGE =<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      "Desired cell size to exceed in bytes that will use the MOB write path";<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  protected static final long DEFAULT_START_KEY = 0;<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  /** This will be removed as we factor out the dependency on command line */<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  protected CommandLine cmd;<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>  protected MultiThreadedWriter writerThreads = null;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  protected MultiThreadedReader readerThreads = null;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  protected MultiThreadedUpdater updaterThreads = null;<a name="line.178"></a>
+<span class="sourceLineNo">125</span>  public static final String OPT_GENERATOR = "generator";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static final String OPT_GENERATOR_USAGE = "The class which generates load for the tool."<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      + " Any args for this class can be passed as colon separated after class name";<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public static final String OPT_WRITER = "writer";<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  public static final String OPT_WRITER_USAGE = "The class for executing the write requests";<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public static final String OPT_UPDATER = "updater";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public static final String OPT_UPDATER_USAGE = "The class for executing the update requests";<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  public static final String OPT_READER = "reader";<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public static final String OPT_READER_USAGE = "The class for executing the read requests";<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  protected static final String OPT_KEY_WINDOW = "key_window";<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  protected static final String OPT_WRITE = "write";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  protected static final String OPT_MAX_READ_ERRORS = "max_read_errors";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String OPT_MULTIPUT = "multiput";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final String OPT_MULTIGET = "multiget_batchsize";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected static final String OPT_NUM_KEYS = "num_keys";<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  protected static final String OPT_READ = "read";<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  protected static final String OPT_START_KEY = "start_key";<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final String OPT_TABLE_NAME = "tn";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final String OPT_COLUMN_FAMILIES = "families";<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected static final String OPT_ZK_QUORUM = "zk";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  protected static final String OPT_ZK_PARENT_NODE = "zk_root";<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  protected static final String OPT_SKIP_INIT = "skip_init";<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  protected static final String OPT_INIT_ONLY = "init_only";<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  protected static final String NUM_TABLES = "num_tables";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  protected static final String OPT_BATCHUPDATE = "batchupdate";<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  protected static final String OPT_UPDATE = "update";<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public static final String OPT_ENCRYPTION = "encryption";<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  protected static final String OPT_ENCRYPTION_USAGE =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    "Enables transparent encryption on the test table, one of " +<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    Arrays.toString(Encryption.getSupportedCiphers());<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public static final String OPT_NUM_REGIONS_PER_SERVER = "num_regions_per_server";<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  protected static final String OPT_NUM_REGIONS_PER_SERVER_USAGE<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    = "Desired number of regions per region server. Defaults to 5.";<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  public static int DEFAULT_NUM_REGIONS_PER_SERVER = 5;<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final String OPT_REGION_REPLICATION = "region_replication";<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  protected static final String OPT_REGION_REPLICATION_USAGE =<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      "Desired number of replicas per region";<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public static final String OPT_REGION_REPLICA_ID = "region_replica_id";<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  protected static final String OPT_REGION_REPLICA_ID_USAGE =<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Region replica id to do the reads from";<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public static final String OPT_MOB_THRESHOLD = "mob_threshold";<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  protected static final String OPT_MOB_THRESHOLD_USAGE =<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Desired cell size to exceed in bytes that will use the MOB write path";<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  protected static final long DEFAULT_START_KEY = 0;<a name="line.178"></a>
 <span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  protected long startKey, endKey;<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>  protected boolean isWrite, isRead, isUpdate;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  protected boolean deferredLogFlush;<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  // Column family options<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  protected DataBlockEncoding dataBlockEncodingAlgo;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  protected Compression.Algorithm compressAlgo;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  protected BloomType bloomType;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  private boolean inMemoryCF;<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private User userOwner;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  // Writer options<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected int numWriterThreads = DEFAULT_NUM_THREADS;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected int minColsPerKey, maxColsPerKey;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected int minColDataSize = DEFAULT_DATA_SIZE, maxColDataSize = DEFAULT_DATA_SIZE;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  protected boolean isMultiPut;<a name="line.196"></a>
+<span class="sourceLineNo">180</span>  /** This will be removed as we factor out the dependency on command line */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  protected CommandLine cmd;<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  protected MultiThreadedWriter writerThreads = null;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  protected MultiThreadedReader readerThreads = null;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  protected MultiThreadedUpdater updaterThreads = null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  protected long startKey, endKey;<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  protected boolean isWrite, isRead, isUpdate;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  protected boolean deferredLogFlush;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>  // Column family options<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  protected DataBlockEncoding dataBlockEncodingAlgo;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected Compression.Algorithm compressAlgo;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  protected BloomType bloomType;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  private boolean inMemoryCF;<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  // Updater options<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  protected int numUpdaterThreads = DEFAULT_NUM_THREADS;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected int updatePercent;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  protected boolean ignoreConflicts = false;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  protected boolean isBatchUpdate;<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>  // Reader options<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  private int numReaderThreads = DEFAULT_NUM_THREADS;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private int keyWindow = MultiThreadedReader.DEFAULT_KEY_WINDOW;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  private int multiGetBatchSize = MultiThreadedReader.DEFAULT_BATCH_SIZE;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private int maxReadErrors = MultiThreadedReader.DEFAULT_MAX_ERRORS;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int verifyPercent;<a name="line.209"></a>
+<span class="sourceLineNo">198</span>  private User userOwner;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  // Writer options<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  protected int numWriterThreads = DEFAULT_NUM_THREADS;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  protected int minColsPerKey, maxColsPerKey;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected int minColDataSize = DEFAULT_DATA_SIZE, maxColDataSize = DEFAULT_DATA_SIZE;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected boolean isMultiPut;<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  // Updater options<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  protected int numUpdaterThreads = DEFAULT_NUM_THREADS;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  protected int updatePercent;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  protected boolean ignoreConflicts = false;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected boolean isBatchUpdate;<a name="line.209"></a>
 <span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  private int numTables = 1;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  private String superUser;<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private String userNames;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  //This file is used to read authentication information in secure clusters.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private String authnFileName;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private int numRegionsPerServer = DEFAULT_NUM_REGIONS_PER_SERVER;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private int regionReplication = -1; // not set<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private int regionReplicaId = -1; // not set<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  private int mobThreshold = -1; // not set<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  // TODO: refactor LoadTestToolImpl somewhere to make the usage from tests less bad,<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  //       console tool itself should only be used from console.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected boolean isSkipInit = false;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected boolean isInitOnly = false;<a name="line.228"></a>
+<span class="sourceLineNo">211</span>  // Reader options<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int numReaderThreads = DEFAULT_NUM_THREADS;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  private int keyWindow = MultiThreadedReader.DEFAULT_KEY_WINDOW;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  private int multiGetBatchSize = MultiThreadedReader.DEFAULT_BATCH_SIZE;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  private int maxReadErrors = MultiThreadedReader.DEFAULT_MAX_ERRORS;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private int verifyPercent;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  private int numTables = 1;<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  private String superUser;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  private String userNames;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  //This file is used to read authentication information in secure clusters.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  private String authnFileName;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private int numRegionsPerServer = DEFAULT_NUM_REGIONS_PER_SERVER;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private int regionReplication = -1; // not set<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int regionReplicaId = -1; // not set<a name="line.228"></a>
 <span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>  protected Cipher cipher = null;<a name="line.230"></a>
+<span class="sourceLineNo">230</span>  private int mobThreshold = -1; // not set<a name="line.230"></a>
 <span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  protected String[] splitColonSeparated(String option,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      int minNumCols, int maxNumCols) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    String optVal = cmd.getOptionValue(option);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    String[] cols = optVal.split(COLON);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (cols.length &lt; minNumCols || cols.length &gt; maxNumCols) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      throw new IllegalArgumentException("Expected at least "<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          + minNumCols + " columns but no more than " + maxNumCols +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          " in the colon-separated value '" + optVal + "' of the " +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          "-" + option + " option");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return cols;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  protected int getNumThreads(String numThreadsStr) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return parseInt(numThreadsStr, 1, Short.MAX_VALUE);<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>  public byte[][] getColumnFamilies() {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    return families;<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>   * Apply column family options such as Bloom filters, compression, and data<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * block encoding.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  protected void applyColumnFamilyOptions(TableName tableName,<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      byte[][] columnFamilies) throws IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        Admin admin = conn.getAdmin()) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      TableDescriptor tableDesc = admin.getDescriptor(tableName);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.info("Disabling table " + tableName);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      admin.disableTable(tableName);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      for (byte[] cf : columnFamilies) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        ColumnFamilyDescriptor columnDesc = tableDesc.getColumnFamily(cf);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        boolean isNewCf = columnDesc == null;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        ColumnFamilyDescriptorBuilder columnDescBuilder = isNewCf ?<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            ColumnFamilyDescriptorBuilder.newBuilder(cf) :<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            ColumnFamilyDescriptorBuilder.newBuilder(columnDesc);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        if (bloomType != null) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          columnDescBuilder.setBloomFilterType(bloomType);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        if (compressAlgo != null) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          columnDescBuilder.setCompressionType(compressAlgo);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        if (dataBlockEncodingAlgo != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          columnDescBuilder.setDataBlockEncoding(dataBlockEncodingAlgo);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        if (inMemoryCF) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          columnDescBuilder.setInMemory(inMemoryCF);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (cipher != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          byte[] keyBytes = new byte[cipher.getKeyLength()];<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          new SecureRandom().nextBytes(keyBytes);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          columnDescBuilder.setEncryptionType(cipher.getName());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          columnDescBuilder.setEncryptionKey(<a name="line.286"></a>
-<span class="sourceLineNo">287</span>              EncryptionUtil.wrapKey(conf,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>                  User.getCurrent().getShortName(),<a name="line.288"></a>
-<span class="sourceLineNo">289</span>                  new SecretKeySpec(keyBytes,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>                      cipher.getName())));<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (mobThreshold &gt;= 0) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          columnDescBuilder.setMobEnabled(true);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          columnDescBuilder.setMobThreshold(mobThreshold);<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>        if (isNewCf) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          admin.addColumnFamily(tableName, columnDescBuilder.build());<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        } else {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          admin.modifyColumnFamily(tableName, columnDescBuilder.build());<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      LOG.info("Enabling table " + tableName);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      admin.enableTable(tableName);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  @Override<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  protected void addOptions() {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    addOptWithArg(OPT_ZK_QUORUM, "ZK quorum as comma-separated host names " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        "without port numbers");<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    addOptWithArg(OPT_ZK_PARENT_NODE, "name of parent znode in zookeeper");<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    addOptWithArg(OPT_TABLE_NAME, "The name of the table to read or write");<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    addOptWithArg(OPT_COLUMN_FAMILIES, "The name of the column families to use separated by comma");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    addOptWithArg(OPT_WRITE, OPT_USAGE_LOAD);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    addOptWithArg(OPT_READ, OPT_USAGE_READ);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    addOptWithArg(OPT_UPDATE, OPT_USAGE_UPDATE);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    addOptNoArg(OPT_INIT_ONLY, "Initialize the test table only, don't do any loading");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    addOptWithArg(OPT_BLOOM, OPT_USAGE_BLOOM);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    addOptWithArg(OPT_COMPRESSION, OPT_USAGE_COMPRESSION);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    addOptWithArg(HFileTestUtil.OPT_DATA_BLOCK_ENCODING, HFileTestUtil.OPT_DATA_BLOCK_ENCODING_USAGE);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    addOptWithArg(OPT_MAX_READ_ERRORS, "The maximum number of read errors " +<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        "to tolerate before terminating all reader threads. The default is " +<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        MultiThreadedReader.DEFAULT_MAX_ERRORS + ".");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    addOptWithArg(OPT_MULTIGET, "Whether to use multi-gets as opposed to " +<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        "separate gets for every column in a row");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    addOptWithArg(OPT_KEY_WINDOW, "The 'key window' to maintain between " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        "reads and writes for concurrent write/read workload. The default " +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        "is " + MultiThreadedReader.DEFAULT_KEY_WINDOW + ".");<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    addOptNoArg(OPT_MULTIPUT, "Whether to use multi-puts as opposed to " +<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        "separate puts for every column in a row");<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    addOptNoArg(OPT_BATCHUPDATE, "Whether to use batch as opposed to " +<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "separate updates for every column in a row");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    addOptNoArg(OPT_INMEMORY, OPT_USAGE_IN_MEMORY);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    addOptWithArg(OPT_GENERATOR, OPT_GENERATOR_USAGE);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    addOptWithArg(OPT_WRITER, OPT_WRITER_USAGE);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    addOptWithArg(OPT_UPDATER, OPT_UPDATER_USAGE);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    addOptWithArg(OPT_READER, OPT_READER_USAGE);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    addOptWithArg(OPT_NUM_KEYS, "The number of keys to read/write");<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    addOptWithArg(OPT_START_KEY, "The first key to read/write " +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "(a 0-based index). The default value is " +<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        DEFAULT_START_KEY + ".");<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    addOptNoArg(OPT_SKIP_INIT, "Skip the initialization; assume test table "<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        + "already exists");<a name="line.346"></a>
+<span class="sourceLineNo">232</span>  // TODO: refactor LoadTestToolImpl somewhere to make the usage from tests less bad,<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  //       console tool itself should only be used from console.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  protected boolean isSkipInit = false;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  protected boolean isInitOnly = false;<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  protected Cipher cipher = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  protected String[] splitColonSeparated(String option,<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      int minNumCols, int maxNumCols) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    String optVal = cmd.getOptionValue(option);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    String[] cols = optVal.split(COLON);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    if (cols.length &lt; minNumCols || cols.length &gt; maxNumCols) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      throw new IllegalArgumentException("Expected at least "<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          + minNumCols + " columns but no more than " + maxNumCols +<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          " in the colon-separated value '" + optVal + "' of the " +<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          "-" + option + " option");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    return cols;<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>  protected int getNumThreads(String numThreadsStr) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return parseInt(numThreadsStr, 1, Short.MAX_VALUE);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public byte[][] getColumnFamilies() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return families;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * Apply column family options such as Bloom filters, compression, and data<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * block encoding.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  protected void applyColumnFamilyOptions(TableName tableName,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      byte[][] columnFamilies) throws IOException {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        Admin admin = conn.getAdmin()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      TableDescriptor tableDesc = admin.getDescriptor(tableName);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      LOG.info("Disabling table " + tableName);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      admin.disableTable(tableName);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      for (byte[] cf : columnFamilies) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        ColumnFamilyDescriptor columnDesc = tableDesc.getColumnFamily(cf);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        boolean isNewCf = columnDesc == null;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        ColumnFamilyDescriptorBuilder columnDescBuilder = isNewCf ?<a name="line.274"></a>
+<span class="sourceLineNo">275</span>            ColumnFamilyDescriptorBuilder.newBuilder(cf) :<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            ColumnFamilyDescriptorBuilder.newBuilder(columnDesc);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        if (bloomType != null) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          columnDescBuilder.setBloomFilterType(bloomType);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        if (compressAlgo != null) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          columnDescBuilder.setCompressionType(compressAlgo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        if (dataBlockEncodingAlgo != null) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          columnDescBuilder.setDataBlockEncoding(dataBlockEncodingAlgo);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        if (inMemoryCF) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          columnDescBuilder.setInMemory(inMemoryCF);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        if (cipher != null) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          byte[] keyBytes = new byte[cipher.getKeyLength()];<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          new SecureRandom().nextBytes(keyBytes);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          columnDescBuilder.setEncryptionType(cipher.getName());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          columnDescBuilder.setEncryptionKey(<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              EncryptionUtil.wrapKey(conf,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>                  User.getCurrent().getShortName(),<a name="line.295"></a>
+<span class="sourceLineNo">296</span>                  new SecretKeySpec(keyBytes,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                      cipher.getName())));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        if (mobThreshold &gt;= 0) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          columnDescBuilder.setMobEnabled(true);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          columnDescBuilder.setMobThreshold(mobThreshold);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>        if (isNewCf) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          admin.addColumnFamily(tableName, columnDescBuilder.build());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          admin.modifyColumnFamily(tableName, columnDescBuilder.build());<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>      LOG.info("Enabling table " + tableName);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      admin.enableTable(tableName);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  protected void addOptions() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    addOptWithArg(OPT_ZK_QUORUM, "ZK quorum as comma-separated host names " +<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        "without port numbers");<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    addOptWithArg(OPT_ZK_PARENT_NODE, "name of parent znode in zookeeper");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    addOptWithArg(OPT_TABLE_NAME, "The name of the table to read or write");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    addOptWithArg(OPT_COLUMN_FAMILIES, "The name of the column families to use separated by comma");<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    addOptWithArg(OPT_WRITE, OPT_USAGE_LOAD);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    addOptWithArg(OPT_READ, OPT_USAGE_READ);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    addOptWithArg(OPT_UPDATE, OPT_USAGE_UPDATE);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    addOptNoArg(OPT_INIT_ONLY, "Initialize the test table only, don't do any loading");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    addOptWithArg(OPT_BLOOM, OPT_USAGE_BLOOM);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    addOptWithArg(OPT_COMPRESSION, OPT_USAGE_COMPRESSION);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    addOptWithArg(HFileTestUtil.OPT_DATA_BLOCK_ENCODING, HFileTestUtil.OPT_DATA_BLOCK_ENCODING_USAGE);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    addOptWithArg(OPT_MAX_READ_ERRORS, "The maximum number of read errors " +<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        "to tolerate before terminating all reader threads. The default is " +<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        MultiThreadedReader.DEFAULT_MAX_ERRORS + ".");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    addOptWithArg(OPT_MULTIGET, "Whether to use multi-gets as opposed to " +<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        "separate gets for every column in a row");<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    addOptWithArg(OPT_KEY_WINDOW, "The 'key window' to maintain between " +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        "reads and writes for concurrent write/read workload. The default " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        "is " + MultiThreadedReader.DEFAULT_KEY_WINDOW + ".");<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    addOptNoArg(OPT_MULTIPUT, "Whether to use multi-puts as opposed to " +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        "separate puts for every column in a row");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    addOptNoArg(OPT_BATCHUPDATE, "Whether to use batch as opposed to " +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        "separate updates for every column in a row");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    addOptNoArg(OPT_INMEMORY, OPT_USAGE_IN_MEMORY);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    addOptWithArg(OPT_GENERATOR, OPT_GENERATOR_USAGE);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    addOptWithArg(OPT_WRITER, OPT_WRITER_USAGE);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    addOptWithArg(OPT_UPDATER, OPT_UPDATER_USAGE);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    addOptWithArg(OPT_READER, OPT_READER_USAGE);<a name="line.346"></a>
 <span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    addOptWithArg(NUM_TABLES,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      "A positive integer number. When a number n is specified, load test "<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          + "tool  will load n table parallely. -tn parameter value becomes "<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          + "table name prefix. Each table name is in format &lt;tn&gt;_1...&lt;tn&gt;_n");<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>    addOptWithArg(OPT_ENCRYPTION, OPT_ENCRYPTION_USAGE);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    addOptNoArg(OPT_DEFERRED_LOG_FLUSH, OPT_DEFERRED_LOG_FLUSH_USAGE);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    addOptWithArg(OPT_NUM_REGIONS_PER_SERVER, OPT_NUM_REGIONS_PER_SERVER_USAGE);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    addOptWithArg(OPT_REGION_REPLICATION, OPT_REGION_REPLICATION_USAGE);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    addOptWithArg(OPT_REGION_REPLICA_ID, OPT_REGION_REPLICA_ID_USAGE);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    addOptWithArg(OPT_MOB_THRESHOLD, OPT_MOB_THRESHOLD_USAGE);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>  @Override<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  protected void processOptions(CommandLine cmd) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    this.cmd = cmd;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    tableName = TableName.valueOf(cmd.getOptionValue(OPT_TABLE_NAME,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        DEFAULT_TABLE_NAME));<a name="line.366"></a>
+<span class="sourceLineNo">348</span>    addOptWithArg(OPT_NUM_KEYS, "The number of keys to read/write");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    addOptWithArg(OPT_START_KEY, "The first key to read/write " +<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        "(a 0-based index). The default value is " +<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        DEFAULT_START_KEY + ".");<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    addOptNoArg(OPT_SKIP_INIT, "Skip the initialization; assume test table "<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        + "already exists");<a name="line.353"></a>
+<span class="sourceLineNo">354</span><a name="line.354"></a>
+<span class="sourceLineNo">355</span>    addOptWithArg(NUM_TABLES,<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      "A positive integer number. When a number n is specified, load test "<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          + "tool  will load n table parallely. -tn parameter value becomes "<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          + "table name prefix. Each table name is in format &lt;tn&gt;_1...&lt;tn&gt;_n");<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    addOptWithArg(OPT_ENCRYPTION, OPT_ENCRYPTION_USAGE);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    addOptNoArg(OPT_DEFERRED_LOG_FLUSH, OPT_DEFERRED_LOG_FLUSH_USAGE);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    addOptWithArg(OPT_NUM_REGIONS_PER_SERVER, OPT_NUM_REGIONS_PER_SERVER_USAGE);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    addOptWithArg(OPT_REGION_REPLICATION, OPT_REGION_REPLICATION_USAGE);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    addOptWithArg(OPT_REGION_REPLICA_ID, OPT_REGION_REPLICA_ID_USAGE);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    addOptWithArg(OPT_MOB_THRESHOLD, OPT_MOB_THRESHOLD_USAGE);<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>    if (cmd.hasOption(OPT_COLUMN_FAMILIES)) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      String[] list = cmd.getOptionValue(OPT_COLUMN_FAMILIES).split(",");<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      families = new byte[list.length][];<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      for (int i = 0; i &lt; list.length; i++) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        families[i] = Bytes.toBytes(list[i]);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      families = HFileTestUtil.DEFAULT_COLUMN_FAMILIES;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    }<a name="line.376"></a>
+<span class="sourceLineNo">368</span>  @Override<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  protected CommandLineParser newParser() {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    // Commons-CLI lacks the capability to handle combinations of options, so we do it ourselves<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Validate in parse() to get helpful error messages instead of exploding in processOptions()<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return new DefaultParser() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public CommandLine parse(Options opts, String[] args, Properties props, boolean stop)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          throws ParseException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        CommandLine cl = super.parse(opts, args, props, stop);<a name="line.376"></a>
 <span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>    isWrite = cmd.hasOption(OPT_WRITE);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    isRead = cmd.hasOption(OPT_READ);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    isUpdate = cmd.hasOption(OPT_UPDATE);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    isInitOnly = cmd.hasOption(OPT_INIT_ONLY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    deferredLogFlush = cmd.hasOption(OPT_DEFERRED_LOG_FLUSH);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    if (!isWrite &amp;&amp; !isRead &amp;&amp; !isUpdate &amp;&amp; !isInitOnly) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      throw new IllegalArgumentException("Either -" + OPT_WRITE + " or " +<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        "-" + OPT_UPDATE + " or -" + OPT_READ + " has to be specified");<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>    if (isInitOnly &amp;&amp; (isRead || isWrite || isUpdate)) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      throw new IllegalArgumentException(OPT_INIT_ONLY + " cannot be specified with"<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          + " either -" + OPT_WRITE + " or -" + OPT_UPDATE + " or -" + OPT_READ);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (!isInitOnly) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      if (!cmd.hasOption(OPT_NUM_KEYS)) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        throw new IllegalArgumentException(OPT_NUM_KEYS + " must be specified in "<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            + "read or write mode");<a name="line.397"></a>
+<span class="sourceLineNo">378</span>        boolean isReadWriteUpdate = cmd.hasOption(OPT_READ)<a name="line.378"></a>
+<span class="sourceLineNo">379</span>            || cmd.hasOption(OPT_WRITE)<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            || cmd.hasOption(OPT_UPDATE);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        boolean isInitOnly = cmd.hasOption(OPT_INIT_ONLY);<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if (!isInitOnly &amp;&amp; !isReadWriteUpdate) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          throw new MissingOptionException("Must specify either -" + OPT_INIT_ONLY<a name="line.384"></a>
+<span class="sourceLineNo">385</span>              + " or at least one of -" + OPT_READ + ", -" + OPT_WRITE + ", -" + OPT_UPDATE);<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>        if (isInitOnly &amp;&amp; isReadWriteUpdate) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          throw new AlreadySelectedException(OPT_INIT_ONLY + " cannot be specified with any of -"<a name="line.389"></a>
+<span class="sourceLineNo">390</span>              + OPT_READ + ", -" + OPT_WRITE + ", -" + OPT_UPDATE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>        if (isReadWriteUpdate &amp;&amp; !cmd.hasOption(OPT_NUM_KEYS)) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          throw new MissingOptionException(OPT_NUM_KEYS + " must be specified in read/write mode.");<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>        return cl;<a name="line.397"></a>
 <span class="sourceLineNo">398</span>      }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      startKey = parseLong(cmd.getOptionValue(OPT_START_KEY,<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          String.valueOf(DEFAULT_START_KEY)), 0, Long.MAX_VALUE);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      long numKeys = parseLong(cmd.getOptionValue(OPT_NUM_KEYS), 1,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          Long.MAX_VALUE - startKey);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      endKey = startKey + numKeys;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      isSkipInit = cmd.hasOption(OPT_SKIP_INIT);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      System.out.println("Key range: [" + startKey + ".." + (endKey - 1) + "]");<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    parseColumnFamilyOptions(cmd);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (isWrite) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      String[] writeOpts = splitColonSeparated(OPT_WRITE, 2, 3);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>      int colIndex = 0;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      minColsPerKey = 1;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      maxColsPerKey = 2 * Integer.parseInt(writeOpts[colIndex++]);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      int avgColDataSize =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>          parseInt(writeOpts[colIndex++], 1, Integer.MAX_VALUE);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      minColDataSize = avgColDataSize / 2;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      maxColDataSize = avgColDataSize * 3 / 2;<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (colIndex &lt; writeOpts.length) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        numWriterThreads = getNumThreads(writeOpts[colIndex++]);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">399</span>    };<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>  @Override<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  protected void processOptions(CommandLine cmd) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.cmd = cmd;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>    tableName = TableName.valueOf(cmd.getOptionValue(OPT_TABLE_NAME,<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        DEFAULT_TABLE_NAME));<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    if (cmd.hasOption(OPT_COLUMN_FAMILIES)) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      String[] list = cmd.getOptionValue(OPT_COLUMN_FAMILIES).split(",");<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      families = new byte[list.length][];<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      for (int i = 0; i &lt; list.length; i++) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        families[i] = Bytes.toBytes(list[i]);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    } else {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      families = HFileTestUtil.DEFAULT_COLUMN_FAMILIES;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    isWrite = cmd.hasOption(OPT_WRITE);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    isRead = cmd.hasOption(OPT_READ);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    isUpdate = cmd.hasOption(OPT_UPDATE);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    isInitOnly = cmd.hasOption(OPT_INIT_ONLY);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    deferredLogFlush = cmd.hasOption(OPT_DEFERRED_LOG_FLUSH);<a name="line.423"></a>
 <span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      isMultiPut = cmd.hasOption(OPT_MULTIPUT);<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>      mobThreshold = -1;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      if (cmd.hasOption(OPT_MOB_THRESHOLD)) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        mobThreshold = Integer.parseInt(cmd.getOptionValue(OPT_MOB_THRESHOLD));<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>      System.out.println("Multi-puts: " + isMultiPut);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      System.out.println("Columns per key: " + minColsPerKey + ".."<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          + maxColsPerKey);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      System.out.println("Data size per column: " + minColDataSize + ".."<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          + maxColDataSize);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    if (isUpdate) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      String[] mutateOpts = splitColonSeparated(OPT_UPDATE, 1, 3);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      int colIndex = 0;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      updatePercent = parseInt(mutateOpts[colIndex++], 0, 100);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      if (colIndex &lt; mutateOpts.length) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        numUpdaterThreads = getNumThreads(mutateOpts[colIndex++]);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      if (colIndex &lt; mutateOpts.length) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        ignoreConflicts = parseInt(mutateOpts[colIndex++], 0, 1) == 1;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>      isBatchUpdate = cmd.hasOption(OPT_BATCHUPDATE);<a name="line.450"></a>
+<span class="sourceLineNo">425</span>    if (!isInitOnly) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      startKey = parseLong(cmd.getOptionValue(OPT_START_KEY,<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          String.valueOf(DEFAULT_START_KEY)), 0, Long.MAX_VALUE);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      long numKeys = parseLong(cmd.getOptionValue(OPT_NUM_KEYS), 1,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          Long.MAX_VALUE - startKey);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      endKey = startKey + numKeys;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      isSkipInit = cmd.hasOption(OPT_SKIP_INIT);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      System.out.println("Key range: [" + startKey + ".." + (endKey - 1) + "]");<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>    parseColumnFamilyOptions(cmd);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>    if (isWrite) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      String[] writeOpts = splitColonSeparated(OPT_WRITE, 2, 3);<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      int colIndex = 0;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      minColsPerKey = 1;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      maxColsPerKey = 2 * Integer.parseInt(writeOpts[colIndex++]);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      int avgColDataSize =<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          parseInt(writeOpts[colIndex++], 1, Integer.MAX_VALUE);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      minColDataSize = avgColDataSize / 2;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      maxColDataSize = avgColDataSize * 3 / 2;<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (colIndex &lt; writeOpts.length) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        numWriterThreads = getNumThreads(writeOpts[colIndex++]);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      }<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>      System.out.println("Batch updates: " + isBatchUpdate);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      System.out.println("Percent of keys to update: " + updatePercent);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      System.out.println("Updater threads: " + numUpdaterThreads);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      System.out.println("Ignore nonce conflicts: " + ignoreConflicts);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    if (isRead) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      String[] readOpts = splitColonSeparated(OPT_READ, 1, 2);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      int colIndex = 0;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      verifyPercent = parseInt(readOpts[colIndex++], 0, 100);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (colIndex &lt; readOpts.length) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        numReaderThreads = getNumThreads(readOpts[colIndex++]);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      }<a name="line.464"></a>
+<span class="sourceLineNo">452</span>      isMultiPut = cmd.hasOption(OPT_MULTIPUT);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>      mobThreshold = -1;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      if (cmd.hasOption(OPT_MOB_THRESHOLD)) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        mobThreshold = Integer.parseInt(cmd.getOptionValue(OPT_MOB_THRESHOLD));<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>      System.out.println("Multi-puts: " + isMultiPut);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      System.out.println("Columns per key: " + minColsPerKey + ".."<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          + maxColsPerKey);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      System.out.println("Data size per column: " + minColDataSize + ".."<a name="line.462"></a>
+<span class="sourceLineNo">463</span>          + maxColDataSize);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
 <span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.hasOption(OPT_MAX_READ_ERRORS)) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        maxReadErrors = parseInt(cmd.getOptionValue(OPT_MAX_READ_ERRORS),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>            0, Integer.MAX_VALUE);<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>      if (cmd.hasOption(OPT_KEY_WINDOW)) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        keyWindow = parseInt(cmd.getOptionValue(OPT_KEY_WINDOW),<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            0, Integer.MAX_VALUE);<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>      if (cmd.hasOption(OPT_MULTIGET)) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        multiGetBatchSize = parseInt(cmd.getOptionValue(OPT_MULTIGET),<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            0, Integer.MAX_VALUE);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>      System.out.println("Multi-gets (value of 1 means no multigets): " + multiGetBatchSize);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      System.out.println("Percent of keys to verify: " + verifyPercent);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      System.out.println("Reader threads: " + numReaderThreads);<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>    numTables = 1;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    if (cmd.hasOption(NUM_TABLES)) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      numTables = parseInt(cmd.getOptionValue(NUM_TABLES), 1, Short.MAX_VALUE);<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>    numRegionsPerServer = DEFAULT_NUM_REGIONS_PER_SERVER;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    if (cmd.hasOption(OPT_NUM_REGIONS_PER_SERVER)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      numRegionsPerServer = Integer.parseInt(cmd.getOptionValue(OPT_NUM_REGIONS_PER_SERVER));<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>    regionReplication = 1;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    if (cmd.hasOption(OPT_REGION_REPLICATION)) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regionReplication = Integer.parseInt(cmd.getOptionValue(OPT_REGION_REPLICATION));<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    regionReplicaId = -1;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    if (cmd.hasOption(OPT_REGION_REPLICA_ID)) {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      regionReplicaId = Integer.parseInt(cmd.getOptionValue(OPT_REGION_REPLICA_ID));<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><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  private void parseColumnFamilyOptions(CommandLine cmd) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    String dataBlockEncodingStr = cmd.getOptionValue(HFileTestUtil.OPT_DATA_BLOCK_ENCODING);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    dataBlockEncodingAlgo = dataBlockEncodingStr == null ? null :<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        DataBlockEncoding.valueOf(dataBlockEncodingStr);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    String compressStr = cmd.getOptionValue(OPT_COMPRESSION);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    compressAlgo = compressStr == null ? Compression.Algorithm.NONE :<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        Compression.Algorithm.valueOf(compressStr);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    String bloomStr = cmd.getOptionValue(OPT_BLOOM);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    bloomType = bloomStr == null ? BloomType.ROW :<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        BloomType.valueOf(bloomStr);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    inMemoryCF = cmd.hasOption(OPT_INMEMORY);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    if (cmd.hasOption(OPT_ENCRYPTION)) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      cipher = Encryption.getCipher(conf, cmd.getOptionValue(OPT_ENCRYPTION));<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name=

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLin

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.OptionsOrderComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.OptionsOrderComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.OptionsOrderComparator.html
index e56d4d0..5616ff0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.OptionsOrderComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.OptionsOrderComparator.html
@@ -145,7 +145,7 @@
 <span class="sourceLineNo">137</span>      }<a name="line.137"></a>
 <span class="sourceLineNo">138</span>      String[] remainingArgs = new String[argsList.size()];<a name="line.138"></a>
 <span class="sourceLineNo">139</span>      argsList.toArray(remainingArgs);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      cmd = new DefaultParser().parse(options, remainingArgs);<a name="line.140"></a>
+<span class="sourceLineNo">140</span>      cmd = newParser().parse(options, remainingArgs);<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    } catch (MissingOptionException e) {<a name="line.141"></a>
 <span class="sourceLineNo">142</span>      LOG.error(e.getMessage());<a name="line.142"></a>
 <span class="sourceLineNo">143</span>      LOG.error("Use -h or --help for usage instructions.");<a name="line.143"></a>
@@ -168,123 +168,133 @@
 <span class="sourceLineNo">160</span>    return ret;<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>  private boolean isHelpCommand(String[] args) throws ParseException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    Options helpOption = new Options().addOption(HELP_OPTION);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // this parses the command line but doesn't throw an exception on unknown options<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    CommandLine cl = new DefaultParser().parse(helpOption, args, true);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return cl.getOptions().length != 0;<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>  protected CommandLine parseArgs(String[] args) throws ParseException {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    options.addOption(SHORT_HELP_OPTION, LONG_HELP_OPTION, false, "Show usage");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addOptions();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    CommandLineParser parser = new BasicParser();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return parser.parse(options, args);<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>  protected void printUsage() {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    printUsage("hbase " + getClass().getName() + " &lt;options&gt;", "Options:", "");<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>  protected void printUsage(final String usageStr, final String usageHeader,<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final String usageFooter) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    HelpFormatter helpFormatter = new HelpFormatter();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    helpFormatter.setWidth(120);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    helpFormatter.setOptionComparator(new OptionsOrderComparator());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    helpFormatter.printHelp(usageStr, usageHeader, options, usageFooter);<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>  protected void addOption(Option option) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    options.addOption(option);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    optionsOrder.put(option, optionsCount++);<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>  protected void addRequiredOption(Option option) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    option.setRequired(true);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addOption(option);<a name="line.196"></a>
+<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * Create the parser to use for parsing and validating the command line. Since commons-cli lacks<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * the capability to validate arbitrary combination of options, it may be helpful to bake custom<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * logic into a specialized parser implementation. See LoadTestTool for examples.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @return a new parser specific to the current tool<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  protected CommandLineParser newParser() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return new DefaultParser();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private boolean isHelpCommand(String[] args) throws ParseException {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    Options helpOption = new Options().addOption(HELP_OPTION);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // this parses the command line but doesn't throw an exception on unknown options<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    CommandLine cl = new DefaultParser().parse(helpOption, args, true);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    return cl.getOptions().length != 0;<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>  protected CommandLine parseArgs(String[] args) throws ParseException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    options.addOption(SHORT_HELP_OPTION, LONG_HELP_OPTION, false, "Show usage");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addOptions();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    CommandLineParser parser = new BasicParser();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    return parser.parse(options, args);<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>  protected void printUsage() {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    printUsage("hbase " + getClass().getName() + " &lt;options&gt;", "Options:", "");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  protected void printUsage(final String usageStr, final String usageHeader,<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      final String usageFooter) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    HelpFormatter helpFormatter = new HelpFormatter();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    helpFormatter.setWidth(120);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    helpFormatter.setOptionComparator(new OptionsOrderComparator());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    helpFormatter.printHelp(usageStr, usageHeader, options, usageFooter);<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>  protected void addRequiredOptWithArg(String opt, String description) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    Option option = new Option(opt, true, description);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    option.setRequired(true);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addOption(option);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  protected void addRequiredOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    Option option = new Option(shortOpt, longOpt, true, description);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    option.setRequired(true);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    addOption(option);<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>  protected void addOptNoArg(String opt, String description) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    addOption(new Option(opt, false, description));<a name="line.212"></a>
+<span class="sourceLineNo">199</span>  protected void addOption(Option option) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    options.addOption(option);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    optionsOrder.put(option, optionsCount++);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  protected void addRequiredOption(Option option) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    option.setRequired(true);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    addOption(option);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected void addRequiredOptWithArg(String opt, String description) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    Option option = new Option(opt, true, description);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    option.setRequired(true);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addOption(option);<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>  protected void addOptNoArg(String shortOpt, String longOpt, String description) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addOption(new Option(shortOpt, longOpt, false, description));<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  protected void addOptWithArg(String opt, String description) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addOption(new Option(opt, true, description));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected void addOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addOption(new Option(shortOpt, longOpt, true, description));<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>  public int getOptionAsInt(CommandLine cmd, String opt, int defaultValue) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (cmd.hasOption(opt)) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      return Integer.parseInt(cmd.getOptionValue(opt));<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    } else {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return defaultValue;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public long getOptionAsLong(CommandLine cmd, String opt, int defaultValue) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (cmd.hasOption(opt)) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      return Long.parseLong(cmd.getOptionValue(opt));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    } else {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return defaultValue;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  public double getOptionAsDouble(CommandLine cmd, String opt, double defaultValue) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    if (cmd.hasOption(opt)) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return Double.parseDouble(cmd.getOptionValue(opt));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    } else {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return defaultValue;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * Parse a number and enforce a range.<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  public static long parseLong(String s, long minValue, long maxValue) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    long l = Long.parseLong(s);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    if (l &lt; minValue || l &gt; maxValue) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      throw new IllegalArgumentException("The value " + l<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          + " is out of range [" + minValue + ", " + maxValue + "]");<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    return l;<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>  public static int parseInt(String s, int minValue, int maxValue) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    return (int) parseLong(s, minValue, maxValue);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  /** Call this from the concrete tool class's main function. */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  protected void doStaticMain(String args[]) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    int ret;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    try {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      ret = ToolRunner.run(HBaseConfiguration.create(), this, args);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    } catch (Exception ex) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      LOG.error("Error running command-line tool", ex);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      ret = EXIT_FAILURE;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    System.exit(ret);<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>}<a name="line.279"></a>
+<span class="sourceLineNo">215</span>  protected void addRequiredOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    Option option = new Option(shortOpt, longOpt, true, description);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    option.setRequired(true);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addOption(option);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  protected void addOptNoArg(String opt, String description) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addOption(new Option(opt, false, description));<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>  protected void addOptNoArg(String shortOpt, String longOpt, String description) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    addOption(new Option(shortOpt, longOpt, false, description));<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 void addOptWithArg(String opt, String description) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    addOption(new Option(opt, true, description));<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>  protected void addOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    addOption(new Option(shortOpt, longOpt, true, description));<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>  public int getOptionAsInt(CommandLine cmd, String opt, int defaultValue) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    if (cmd.hasOption(opt)) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      return Integer.parseInt(cmd.getOptionValue(opt));<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    } else {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      return defaultValue;<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><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public long getOptionAsLong(CommandLine cmd, String opt, int defaultValue) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    if (cmd.hasOption(opt)) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      return Long.parseLong(cmd.getOptionValue(opt));<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    } else {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return defaultValue;<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>  public double getOptionAsDouble(CommandLine cmd, String opt, double defaultValue) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (cmd.hasOption(opt)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      return Double.parseDouble(cmd.getOptionValue(opt));<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    } else {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return defaultValue;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Parse a number and enforce a range.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public static long parseLong(String s, long minValue, long maxValue) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    long l = Long.parseLong(s);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    if (l &lt; minValue || l &gt; maxValue) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IllegalArgumentException("The value " + l<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          + " is out of range [" + minValue + ", " + maxValue + "]");<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return l;<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 static int parseInt(String s, int minValue, int maxValue) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return (int) parseLong(s, minValue, maxValue);<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>  /** Call this from the concrete tool class's main function. */<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void doStaticMain(String args[]) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    int ret;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    try {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      ret = ToolRunner.run(HBaseConfiguration.create(), this, args);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    } catch (Exception ex) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      LOG.error("Error running command-line tool", ex);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      ret = EXIT_FAILURE;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    System.exit(ret);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>}<a name="line.289"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
index e56d4d0..5616ff0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
@@ -145,7 +145,7 @@
 <span class="sourceLineNo">137</span>      }<a name="line.137"></a>
 <span class="sourceLineNo">138</span>      String[] remainingArgs = new String[argsList.size()];<a name="line.138"></a>
 <span class="sourceLineNo">139</span>      argsList.toArray(remainingArgs);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      cmd = new DefaultParser().parse(options, remainingArgs);<a name="line.140"></a>
+<span class="sourceLineNo">140</span>      cmd = newParser().parse(options, remainingArgs);<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    } catch (MissingOptionException e) {<a name="line.141"></a>
 <span class="sourceLineNo">142</span>      LOG.error(e.getMessage());<a name="line.142"></a>
 <span class="sourceLineNo">143</span>      LOG.error("Use -h or --help for usage instructions.");<a name="line.143"></a>
@@ -168,123 +168,133 @@
 <span class="sourceLineNo">160</span>    return ret;<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>  private boolean isHelpCommand(String[] args) throws ParseException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    Options helpOption = new Options().addOption(HELP_OPTION);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // this parses the command line but doesn't throw an exception on unknown options<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    CommandLine cl = new DefaultParser().parse(helpOption, args, true);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return cl.getOptions().length != 0;<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>  protected CommandLine parseArgs(String[] args) throws ParseException {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    options.addOption(SHORT_HELP_OPTION, LONG_HELP_OPTION, false, "Show usage");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addOptions();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    CommandLineParser parser = new BasicParser();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return parser.parse(options, args);<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>  protected void printUsage() {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    printUsage("hbase " + getClass().getName() + " &lt;options&gt;", "Options:", "");<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>  protected void printUsage(final String usageStr, final String usageHeader,<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final String usageFooter) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    HelpFormatter helpFormatter = new HelpFormatter();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    helpFormatter.setWidth(120);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    helpFormatter.setOptionComparator(new OptionsOrderComparator());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    helpFormatter.printHelp(usageStr, usageHeader, options, usageFooter);<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>  protected void addOption(Option option) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    options.addOption(option);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    optionsOrder.put(option, optionsCount++);<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>  protected void addRequiredOption(Option option) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    option.setRequired(true);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addOption(option);<a name="line.196"></a>
+<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * Create the parser to use for parsing and validating the command line. Since commons-cli lacks<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * the capability to validate arbitrary combination of options, it may be helpful to bake custom<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * logic into a specialized parser implementation. See LoadTestTool for examples.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @return a new parser specific to the current tool<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  protected CommandLineParser newParser() {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return new DefaultParser();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private boolean isHelpCommand(String[] args) throws ParseException {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    Options helpOption = new Options().addOption(HELP_OPTION);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // this parses the command line but doesn't throw an exception on unknown options<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    CommandLine cl = new DefaultParser().parse(helpOption, args, true);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    return cl.getOptions().length != 0;<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>  protected CommandLine parseArgs(String[] args) throws ParseException {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    options.addOption(SHORT_HELP_OPTION, LONG_HELP_OPTION, false, "Show usage");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addOptions();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    CommandLineParser parser = new BasicParser();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    return parser.parse(options, args);<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>  protected void printUsage() {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    printUsage("hbase " + getClass().getName() + " &lt;options&gt;", "Options:", "");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>  protected void printUsage(final String usageStr, final String usageHeader,<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      final String usageFooter) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    HelpFormatter helpFormatter = new HelpFormatter();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    helpFormatter.setWidth(120);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    helpFormatter.setOptionComparator(new OptionsOrderComparator());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    helpFormatter.printHelp(usageStr, usageHeader, options, usageFooter);<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>  protected void addRequiredOptWithArg(String opt, String description) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    Option option = new Option(opt, true, description);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    option.setRequired(true);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addOption(option);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  protected void addRequiredOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    Option option = new Option(shortOpt, longOpt, true, description);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    option.setRequired(true);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    addOption(option);<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>  protected void addOptNoArg(String opt, String description) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    addOption(new Option(opt, false, description));<a name="line.212"></a>
+<span class="sourceLineNo">199</span>  protected void addOption(Option option) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    options.addOption(option);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    optionsOrder.put(option, optionsCount++);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  protected void addRequiredOption(Option option) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    option.setRequired(true);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    addOption(option);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected void addRequiredOptWithArg(String opt, String description) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    Option option = new Option(opt, true, description);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    option.setRequired(true);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    addOption(option);<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>  protected void addOptNoArg(String shortOpt, String longOpt, String description) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    addOption(new Option(shortOpt, longOpt, false, description));<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  protected void addOptWithArg(String opt, String description) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    addOption(new Option(opt, true, description));<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  protected void addOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    addOption(new Option(shortOpt, longOpt, true, description));<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>  public int getOptionAsInt(CommandLine cmd, String opt, int defaultValue) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (cmd.hasOption(opt)) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      return Integer.parseInt(cmd.getOptionValue(opt));<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    } else {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return defaultValue;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public long getOptionAsLong(CommandLine cmd, String opt, int defaultValue) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (cmd.hasOption(opt)) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      return Long.parseLong(cmd.getOptionValue(opt));<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    } else {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return defaultValue;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  public double getOptionAsDouble(CommandLine cmd, String opt, double defaultValue) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    if (cmd.hasOption(opt)) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return Double.parseDouble(cmd.getOptionValue(opt));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    } else {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return defaultValue;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * Parse a number and enforce a range.<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  public static long parseLong(String s, long minValue, long maxValue) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    long l = Long.parseLong(s);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    if (l &lt; minValue || l &gt; maxValue) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      throw new IllegalArgumentException("The value " + l<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          + " is out of range [" + minValue + ", " + maxValue + "]");<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    return l;<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>  public static int parseInt(String s, int minValue, int maxValue) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    return (int) parseLong(s, minValue, maxValue);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  /** Call this from the concrete tool class's main function. */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  protected void doStaticMain(String args[]) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    int ret;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    try {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      ret = ToolRunner.run(HBaseConfiguration.create(), this, args);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    } catch (Exception ex) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      LOG.error("Error running command-line tool", ex);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      ret = EXIT_FAILURE;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    System.exit(ret);<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>}<a name="line.279"></a>
+<span class="sourceLineNo">215</span>  protected void addRequiredOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    Option option = new Option(shortOpt, longOpt, true, description);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    option.setRequired(true);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    addOption(option);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  protected void addOptNoArg(String opt, String description) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    addOption(new Option(opt, false, description));<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>  protected void addOptNoArg(String shortOpt, String longOpt, String description) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    addOption(new Option(shortOpt, longOpt, false, description));<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 void addOptWithArg(String opt, String description) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    addOption(new Option(opt, true, description));<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>  protected void addOptWithArg(String shortOpt, String longOpt, String description) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    addOption(new Option(shortOpt, longOpt, true, description));<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>  public int getOptionAsInt(CommandLine cmd, String opt, int defaultValue) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    if (cmd.hasOption(opt)) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      return Integer.parseInt(cmd.getOptionValue(opt));<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    } else {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      return defaultValue;<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><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public long getOptionAsLong(CommandLine cmd, String opt, int defaultValue) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    if (cmd.hasOption(opt)) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      return Long.parseLong(cmd.getOptionValue(opt));<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    } else {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return defaultValue;<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>  public double getOptionAsDouble(CommandLine cmd, String opt, double defaultValue) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (cmd.hasOption(opt)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      return Double.parseDouble(cmd.getOptionValue(opt));<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    } else {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return defaultValue;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Parse a number and enforce a range.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public static long parseLong(String s, long minValue, long maxValue) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    long l = Long.parseLong(s);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    if (l &lt; minValue || l &gt; maxValue) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IllegalArgumentException("The value " + l<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          + " is out of range [" + minValue + ", " + maxValue + "]");<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return l;<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 static int parseInt(String s, int minValue, int maxValue) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    return (int) parseLong(s, minValue, maxValue);<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>  /** Call this from the concrete tool class's main function. */<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  protected void doStaticMain(String args[]) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    int ret;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    try {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      ret = ToolRunner.run(HBaseConfiguration.create(), this, args);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    } catch (Exception ex) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      LOG.error("Error running command-line tool", ex);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      ret = EXIT_FAILURE;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    System.exit(ret);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>}<a name="line.289"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.DecimalStringSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.DecimalStringSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.DecimalStringSplit.html
index bca6876..1275b2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.DecimalStringSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.DecimalStringSplit.html
@@ -339,7 +339,7 @@
 <span class="sourceLineNo">331</span>    opt.addOption(null, "lastrow", true,<a name="line.331"></a>
 <span class="sourceLineNo">332</span>        "Last Row in Table for Split Algorithm");<a name="line.332"></a>
 <span class="sourceLineNo">333</span>    opt.addOption(null, "risky", false,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly."<a name="line.334"></a>
+<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly. "<a name="line.334"></a>
 <span class="sourceLineNo">335</span>            + "STRONGLY DISCOURAGED for production systems.  ");<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    CommandLine cmd = new GnuParser().parse(opt, args);<a name="line.336"></a>
 <span class="sourceLineNo">337</span><a name="line.337"></a>
@@ -364,8 +364,8 @@
 <span class="sourceLineNo">356</span>    boolean oneOperOnly = createTable ^ rollingSplit;<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
 <span class="sourceLineNo">358</span>    if (2 != cmd.getArgList().size() || !oneOperOnly || cmd.hasOption("h")) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("RegionSplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          "SPLITALGORITHM is a java class name of a class implementing " +<a name="line.360"></a>
+<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          "SPLITALGORITHM is the java class name of a class implementing " +<a name="line.360"></a>
 <span class="sourceLineNo">361</span>          "SplitAlgorithm, or one of the special strings HexStringSplit or " +<a name="line.361"></a>
 <span class="sourceLineNo">362</span>          "DecimalStringSplit or UniformSplit, which are built-in split algorithms. " +<a name="line.362"></a>
 <span class="sourceLineNo">363</span>          "HexStringSplit treats keys as hexadecimal ASCII, and " +<a name="line.363"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.HexStringSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.HexStringSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.HexStringSplit.html
index bca6876..1275b2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.HexStringSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.HexStringSplit.html
@@ -339,7 +339,7 @@
 <span class="sourceLineNo">331</span>    opt.addOption(null, "lastrow", true,<a name="line.331"></a>
 <span class="sourceLineNo">332</span>        "Last Row in Table for Split Algorithm");<a name="line.332"></a>
 <span class="sourceLineNo">333</span>    opt.addOption(null, "risky", false,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly."<a name="line.334"></a>
+<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly. "<a name="line.334"></a>
 <span class="sourceLineNo">335</span>            + "STRONGLY DISCOURAGED for production systems.  ");<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    CommandLine cmd = new GnuParser().parse(opt, args);<a name="line.336"></a>
 <span class="sourceLineNo">337</span><a name="line.337"></a>
@@ -364,8 +364,8 @@
 <span class="sourceLineNo">356</span>    boolean oneOperOnly = createTable ^ rollingSplit;<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
 <span class="sourceLineNo">358</span>    if (2 != cmd.getArgList().size() || !oneOperOnly || cmd.hasOption("h")) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("RegionSplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          "SPLITALGORITHM is a java class name of a class implementing " +<a name="line.360"></a>
+<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          "SPLITALGORITHM is the java class name of a class implementing " +<a name="line.360"></a>
 <span class="sourceLineNo">361</span>          "SplitAlgorithm, or one of the special strings HexStringSplit or " +<a name="line.361"></a>
 <span class="sourceLineNo">362</span>          "DecimalStringSplit or UniformSplit, which are built-in split algorithms. " +<a name="line.362"></a>
 <span class="sourceLineNo">363</span>          "HexStringSplit treats keys as hexadecimal ASCII, and " +<a name="line.363"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.NumberStringSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.NumberStringSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.NumberStringSplit.html
index bca6876..1275b2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.NumberStringSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.NumberStringSplit.html
@@ -339,7 +339,7 @@
 <span class="sourceLineNo">331</span>    opt.addOption(null, "lastrow", true,<a name="line.331"></a>
 <span class="sourceLineNo">332</span>        "Last Row in Table for Split Algorithm");<a name="line.332"></a>
 <span class="sourceLineNo">333</span>    opt.addOption(null, "risky", false,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly."<a name="line.334"></a>
+<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly. "<a name="line.334"></a>
 <span class="sourceLineNo">335</span>            + "STRONGLY DISCOURAGED for production systems.  ");<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    CommandLine cmd = new GnuParser().parse(opt, args);<a name="line.336"></a>
 <span class="sourceLineNo">337</span><a name="line.337"></a>
@@ -364,8 +364,8 @@
 <span class="sourceLineNo">356</span>    boolean oneOperOnly = createTable ^ rollingSplit;<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
 <span class="sourceLineNo">358</span>    if (2 != cmd.getArgList().size() || !oneOperOnly || cmd.hasOption("h")) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("RegionSplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          "SPLITALGORITHM is a java class name of a class implementing " +<a name="line.360"></a>
+<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          "SPLITALGORITHM is the java class name of a class implementing " +<a name="line.360"></a>
 <span class="sourceLineNo">361</span>          "SplitAlgorithm, or one of the special strings HexStringSplit or " +<a name="line.361"></a>
 <span class="sourceLineNo">362</span>          "DecimalStringSplit or UniformSplit, which are built-in split algorithms. " +<a name="line.362"></a>
 <span class="sourceLineNo">363</span>          "HexStringSplit treats keys as hexadecimal ASCII, and " +<a name="line.363"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.SplitAlgorithm.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.SplitAlgorithm.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.SplitAlgorithm.html
index bca6876..1275b2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.SplitAlgorithm.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.SplitAlgorithm.html
@@ -339,7 +339,7 @@
 <span class="sourceLineNo">331</span>    opt.addOption(null, "lastrow", true,<a name="line.331"></a>
 <span class="sourceLineNo">332</span>        "Last Row in Table for Split Algorithm");<a name="line.332"></a>
 <span class="sourceLineNo">333</span>    opt.addOption(null, "risky", false,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly."<a name="line.334"></a>
+<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly. "<a name="line.334"></a>
 <span class="sourceLineNo">335</span>            + "STRONGLY DISCOURAGED for production systems.  ");<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    CommandLine cmd = new GnuParser().parse(opt, args);<a name="line.336"></a>
 <span class="sourceLineNo">337</span><a name="line.337"></a>
@@ -364,8 +364,8 @@
 <span class="sourceLineNo">356</span>    boolean oneOperOnly = createTable ^ rollingSplit;<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
 <span class="sourceLineNo">358</span>    if (2 != cmd.getArgList().size() || !oneOperOnly || cmd.hasOption("h")) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("RegionSplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          "SPLITALGORITHM is a java class name of a class implementing " +<a name="line.360"></a>
+<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          "SPLITALGORITHM is the java class name of a class implementing " +<a name="line.360"></a>
 <span class="sourceLineNo">361</span>          "SplitAlgorithm, or one of the special strings HexStringSplit or " +<a name="line.361"></a>
 <span class="sourceLineNo">362</span>          "DecimalStringSplit or UniformSplit, which are built-in split algorithms. " +<a name="line.362"></a>
 <span class="sourceLineNo">363</span>          "HexStringSplit treats keys as hexadecimal ASCII, and " +<a name="line.363"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.UniformSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.UniformSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.UniformSplit.html
index bca6876..1275b2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.UniformSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.UniformSplit.html
@@ -339,7 +339,7 @@
 <span class="sourceLineNo">331</span>    opt.addOption(null, "lastrow", true,<a name="line.331"></a>
 <span class="sourceLineNo">332</span>        "Last Row in Table for Split Algorithm");<a name="line.332"></a>
 <span class="sourceLineNo">333</span>    opt.addOption(null, "risky", false,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly."<a name="line.334"></a>
+<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly. "<a name="line.334"></a>
 <span class="sourceLineNo">335</span>            + "STRONGLY DISCOURAGED for production systems.  ");<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    CommandLine cmd = new GnuParser().parse(opt, args);<a name="line.336"></a>
 <span class="sourceLineNo">337</span><a name="line.337"></a>
@@ -364,8 +364,8 @@
 <span class="sourceLineNo">356</span>    boolean oneOperOnly = createTable ^ rollingSplit;<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
 <span class="sourceLineNo">358</span>    if (2 != cmd.getArgList().size() || !oneOperOnly || cmd.hasOption("h")) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("RegionSplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          "SPLITALGORITHM is a java class name of a class implementing " +<a name="line.360"></a>
+<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          "SPLITALGORITHM is the java class name of a class implementing " +<a name="line.360"></a>
 <span class="sourceLineNo">361</span>          "SplitAlgorithm, or one of the special strings HexStringSplit or " +<a name="line.361"></a>
 <span class="sourceLineNo">362</span>          "DecimalStringSplit or UniformSplit, which are built-in split algorithms. " +<a name="line.362"></a>
 <span class="sourceLineNo">363</span>          "HexStringSplit treats keys as hexadecimal ASCII, and " +<a name="line.363"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.html
index bca6876..1275b2c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/RegionSplitter.html
@@ -339,7 +339,7 @@
 <span class="sourceLineNo">331</span>    opt.addOption(null, "lastrow", true,<a name="line.331"></a>
 <span class="sourceLineNo">332</span>        "Last Row in Table for Split Algorithm");<a name="line.332"></a>
 <span class="sourceLineNo">333</span>    opt.addOption(null, "risky", false,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly."<a name="line.334"></a>
+<span class="sourceLineNo">334</span>        "Skip verification steps to complete quickly. "<a name="line.334"></a>
 <span class="sourceLineNo">335</span>            + "STRONGLY DISCOURAGED for production systems.  ");<a name="line.335"></a>
 <span class="sourceLineNo">336</span>    CommandLine cmd = new GnuParser().parse(opt, args);<a name="line.336"></a>
 <span class="sourceLineNo">337</span><a name="line.337"></a>
@@ -364,8 +364,8 @@
 <span class="sourceLineNo">356</span>    boolean oneOperOnly = createTable ^ rollingSplit;<a name="line.356"></a>
 <span class="sourceLineNo">357</span><a name="line.357"></a>
 <span class="sourceLineNo">358</span>    if (2 != cmd.getArgList().size() || !oneOperOnly || cmd.hasOption("h")) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("RegionSplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          "SPLITALGORITHM is a java class name of a class implementing " +<a name="line.360"></a>
+<span class="sourceLineNo">359</span>      new HelpFormatter().printHelp("bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;\n"+<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          "SPLITALGORITHM is the java class name of a class implementing " +<a name="line.360"></a>
 <span class="sourceLineNo">361</span>          "SplitAlgorithm, or one of the special strings HexStringSplit or " +<a name="line.361"></a>
 <span class="sourceLineNo">362</span>          "DecimalStringSplit or UniformSplit, which are built-in split algorithms. " +<a name="line.362"></a>
 <span class="sourceLineNo">363</span>          "HexStringSplit treats keys as hexadecimal ASCII, and " +<a name="line.363"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index df42a98..b01e87c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -321,7 +321,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 8b8f785..89f3d8c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -425,7 +425,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 54ffc4d..b9f978f 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -281,7 +281,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 111aef1..d8e489c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -278,7 +278,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index ce6556a..9c9787c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -481,7 +481,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index acf94b7..74eb399 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index b6d0616..2afa2ef 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -449,7 +449,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index c8a1f6e..b534cda 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -404,7 +404,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 0d46567..2498c28 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -430,7 +430,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 11b2e1b..a96bdc6 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -365,7 +365,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 98eb833..ed4e2bb 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -759,7 +759,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index bf515fe..6df8fc1 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -325,7 +325,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index d18e00b..3f85cc6 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -295,7 +295,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 9c117d9..f738af5 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -321,7 +321,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index bc31f89..336ddd7 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -298,7 +298,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 1843c34..992cdb9 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -293,7 +293,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index e105876..b8bbbe6 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -321,7 +321,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 02503b2..6257194 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -289,7 +289,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index c5c6d89..76185fa 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -323,7 +323,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index dff6297..4708a2c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -510,7 +510,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index bf21403..fb49b05 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -720,7 +720,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/util/RestartMetaTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/util/RestartMetaTest.html b/testdevapidocs/org/apache/hadoop/hbase/util/RestartMetaTest.html
index a600779..6151933 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/util/RestartMetaTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/util/RestartMetaTest.html
@@ -244,7 +244,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 84112c6..4edd3f8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -139,9 +139,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.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 </ul>
 </li>
 </ul>


[19/25] hbase-site git commit: Published site at c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span

<TRUNCATED>

[24/25] hbase-site git commit: Published site at c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index c02d435..e1c6d75 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,16 +5,16 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180330144539+00'00')
-/CreationDate (D:20180330144539+00'00')
+/ModDate (D:20180331144603+00'00')
+/CreationDate (D:20180331144603+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 26 0 R
-/Outlines 4515 0 R
-/PageLabels 4738 0 R
+/Outlines 4519 0 R
+/PageLabels 4742 0 R
 /PageMode /UseOutlines
 /OpenAction [7 0 R /FitH 842.89]
 /ViewerPreferences << /DisplayDocTitle true
@@ -23,8 +23,8 @@ endobj
 endobj
 3 0 obj
 << /Type /Pages
-/Count 705
-/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 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 65 0 R 67 0 R 69 0 R 76 0 R 79 0 R 81 0 R 87 0 R 90 0 R 92 0 R 94 0 R 101 0 R 107 0 R 112 0 R 114 0 R 130 0 R 135 0 R 142 0 R 151 0 R 159 0 R 168 0 R 179 0 R 183 0 R 185 0 R 189 0 R 198 0 R 207 0 R 215 0 R 224 0 R 229 0 R 238 0 R 246 0 R 255 0 R 268 0 R 275 0 R 285 0 R 293 0 R 301 0 R 308 0 R 316 0 R 322 0 R 328 0 R 335 0 R 343 0 R 354 0 R 363 0 R 375 0 R 383 0 R 391 0 R 398 0 R 407 0 R 415 0 R 425 0 R 433 0 R 440 0 R 449 0 R 461 0 R 470 0 R 477 0 R 485 0 R 493 0 R 502 0 R 509 0 R 514 0 R 518 0 R 523 0 R 527 0 R 543 0 R 554 0 R 558 0 R 573 0 R 578 0 R 583 0 R 585 0 R 587 0 R 590 0 R 592 0 R 594 0 R 602 0 R 608 0 R 613 0 R 618 0 R 625 0 R 635 0 R 643 0 R 647 0 R 651 0 R 653 0 R 664 0 R 674 0 R 681 0 R 693 0 R 704 0 R 713 0 R 721 0 R 727 0 R 730 0 R 734 0 R 738 0 R 741 0 R 744 0 R 746 0 R 749 0 R 754 0 R 756 0 R 761 0 R 765 0 R 770 0 R 774 0 R 777 0 R 783 0 R 785 0 R 790 0 R 798 0 R 800 0 
 R 803 0 R 806 0 R 810 0 R 813 0 R 828 0 R 835 0 R 844 0 R 855 0 R 861 0 R 871 0 R 882 0 R 885 0 R 889 0 R 892 0 R 897 0 R 906 0 R 914 0 R 918 0 R 922 0 R 927 0 R 931 0 R 933 0 R 948 0 R 959 0 R 964 0 R 970 0 R 973 0 R 981 0 R 989 0 R 994 0 R 1000 0 R 1005 0 R 1007 0 R 1009 0 R 1011 0 R 1021 0 R 1029 0 R 1033 0 R 1040 0 R 1047 0 R 1055 0 R 1059 0 R 1065 0 R 1070 0 R 1078 0 R 1082 0 R 1087 0 R 1089 0 R 1095 0 R 1102 0 R 1104 0 R 1111 0 R 1122 0 R 1126 0 R 1128 0 R 1130 0 R 1134 0 R 1137 0 R 1142 0 R 1145 0 R 1157 0 R 1161 0 R 1167 0 R 1175 0 R 1180 0 R 1184 0 R 1188 0 R 1190 0 R 1193 0 R 1196 0 R 1199 0 R 1203 0 R 1207 0 R 1211 0 R 1216 0 R 1220 0 R 1223 0 R 1225 0 R 1235 0 R 1238 0 R 1246 0 R 1255 0 R 1261 0 R 1265 0 R 1267 0 R 1277 0 R 1280 0 R 1286 0 R 1295 0 R 1298 0 R 1305 0 R 1313 0 R 1315 0 R 1317 0 R 1326 0 R 1328 0 R 1330 0 R 1333 0 R 1335 0 R 1337 0 R 1339 0 R 1341 0 R 1344 0 R 1348 0 R 1353 0 R 1355 0 R 1357 0 R 1359 0 R 1364 0 R 1372 0 R 1377 0 R 1380 0 R 1382 0 R 1385 0 R
  1389 0 R 1393 0 R 1396 0 R 1398 0 R 1400 0 R 1403 0 R 1409 0 R 1414 0 R 1422 0 R 1436 0 R 1450 0 R 1454 0 R 1459 0 R 1472 0 R 1477 0 R 1492 0 R 1500 0 R 1504 0 R 1512 0 R 1527 0 R 1541 0 R 1553 0 R 1558 0 R 1564 0 R 1573 0 R 1579 0 R 1584 0 R 1592 0 R 1595 0 R 1605 0 R 1611 0 R 1614 0 R 1627 0 R 1629 0 R 1635 0 R 1639 0 R 1641 0 R 1649 0 R 1657 0 R 1661 0 R 1663 0 R 1665 0 R 1677 0 R 1683 0 R 1692 0 R 1698 0 R 1712 0 R 1717 0 R 1726 0 R 1734 0 R 1740 0 R 1745 0 R 1751 0 R 1754 0 R 1757 0 R 1762 0 R 1766 0 R 1773 0 R 1777 0 R 1782 0 R 1791 0 R 1796 0 R 1801 0 R 1803 0 R 1811 0 R 1818 0 R 1824 0 R 1829 0 R 1833 0 R 1836 0 R 1841 0 R 1846 0 R 1854 0 R 1856 0 R 1858 0 R 1861 0 R 1869 0 R 1872 0 R 1879 0 R 1888 0 R 1891 0 R 1896 0 R 1898 0 R 1901 0 R 1904 0 R 1907 0 R 1918 0 R 1923 0 R 1928 0 R 1930 0 R 1939 0 R 1946 0 R 1954 0 R 1960 0 R 1965 0 R 1967 0 R 1976 0 R 1985 0 R 1996 0 R 2002 0 R 2009 0 R 2011 0 R 2016 0 R 2018 0 R 2020 0 R 2023 0 R 2026 0 R 2029 0 R 2034 0 R 2038 0 R 2049 0
  R 2052 0 R 2057 0 R 2060 0 R 2062 0 R 2067 0 R 2077 0 R 2079 0 R 2081 0 R 2083 0 R 2085 0 R 2088 0 R 2090 0 R 2092 0 R 2095 0 R 2097 0 R 2099 0 R 2104 0 R 2109 0 R 2118 0 R 2120 0 R 2122 0 R 2129 0 R 2131 0 R 2136 0 R 2138 0 R 2140 0 R 2147 0 R 2152 0 R 2156 0 R 2160 0 R 2164 0 R 2166 0 R 2168 0 R 2172 0 R 2175 0 R 2177 0 R 2179 0 R 2183 0 R 2185 0 R 2188 0 R 2190 0 R 2192 0 R 2194 0 R 2201 0 R 2204 0 R 2209 0 R 2211 0 R 2213 0 R 2215 0 R 2217 0 R 2225 0 R 2236 0 R 2250 0 R 2261 0 R 2265 0 R 2271 0 R 2275 0 R 2278 0 R 2283 0 R 2288 0 R 2290 0 R 2293 0 R 2295 0 R 2297 0 R 2299 0 R 2304 0 R 2306 0 R 2319 0 R 2322 0 R 2330 0 R 2336 0 R 2348 0 R 2362 0 R 2375 0 R 2392 0 R 2396 0 R 2398 0 R 2402 0 R 2420 0 R 2427 0 R 2439 0 R 2443 0 R 2447 0 R 2456 0 R 2468 0 R 2473 0 R 2483 0 R 2496 0 R 2516 0 R 2525 0 R 2528 0 R 2537 0 R 2554 0 R 2561 0 R 2564 0 R 2569 0 R 2573 0 R 2576 0 R 2585 0 R 2593 0 R 2597 0 R 2599 0 R 2603 0 R 2617 0 R 2626 0 R 2631 0 R 2635 0 R 2638 0 R 2640 0 R 2642 0 R 2644
  0 R 2649 0 R 2662 0 R 2672 0 R 2680 0 R 2686 0 R 2692 0 R 2702 0 R 2709 0 R 2715 0 R 2717 0 R 2725 0 R 2734 0 R 2743 0 R 2748 0 R 2756 0 R 2760 0 R 2770 0 R 2778 0 R 2787 0 R 2792 0 R 2796 0 R 2800 0 R 2802 0 R 2808 0 R 2812 0 R 2816 0 R 2822 0 R 2828 0 R 2831 0 R 2837 0 R 2841 0 R 2851 0 R 2856 0 R 2861 0 R 2870 0 R 2876 0 R 2884 0 R 2886 0 R 2891 0 R 2897 0 R 2901 0 R 2905 0 R 2914 0 R 2921 0 R 2923 0 R 2927 0 R 2934 0 R 2937 0 R 2947 0 R 2953 0 R 2962 0 R 2965 0 R 2975 0 R 2980 0 R 2984 0 R 2992 0 R 2997 0 R 3001 0 R 3003 0 R 3014 0 R 3019 0 R 3022 0 R 3024 0 R 3026 0 R 3036 0 R 3043 0 R 3047 0 R 3050 0 R 3057 0 R 3060 0 R 3063 0 R 3066 0 R 3073 0 R 3078 0 R 3084 0 R 3088 0 R 3091 0 R 3094 0 R 3096 0 R 3100 0 R 3111 0 R 3113 0 R 3117 0 R 3120 0 R 3124 0 R 3127 0 R 3131 0 R 3133 0 R 3146 0 R 3151 0 R 3156 0 R 3163 0 R 3172 0 R 3174 0 R 3182 0 R 3200 0 R 3212 0 R 3218 0 R 3234 0 R 3237 0 R 3242 0 R 3244 0 R 3252 0 R 3257 0 R 3260 0 R 3262 0 R 3264 0 R 3266 0 R 3269 0 R 3286 0 R 32
 89 0 R 3295 0 R 3301 0 R 3310 0 R 3316 0 R 3326 0 R 3337 0 R 3344 0 R 3353 0 R 3358 0 R 3361 0 R 3369 0 R 3373 0 R 3378 0 R 3383 0 R 3396 0 R 3399 0 R 3405 0 R 3410 0 R 3419 0 R 3428 0 R 3434 0 R 3447 0 R 3453 0 R 3457 0 R 3465 0 R 3469 0 R 3474 0 R 3476 0 R 3482 0 R 3489 0 R 3491 0 R 3498 0 R 3500 0 R 3508 0 R 3515 0 R 3521 0 R 3528 0 R 3538 0 R 3545 0 R 3557 0 R 3564 0 R 3577 0 R 3584 0 R 3586 0 R 3591 0 R 3604 0 R 3609 0 R 3615 0 R 3619 0 R 3622 0 R 3627 0 R 3629 0 R 3633 0 R 3635 0 R 3639 0 R 3642 0 R 3645 0 R 3653 0 R 3655 0 R 3659 0 R 3662 0 R 3669 0 R 3675 0 R 3679 0 R 3682 0 R 3684 0 R 3688 0 R 3693 0 R 3698 0 R 3701 0 R 3714 0 R 3719 0 R 3723 0 R 3726 0 R 3734 0 R 3738 0 R 3746 0 R 3751 0 R 3753 0 R 3759 0 R 3761 0 R 3766 0 R 3770 0 R 3775 0 R 3779 0 R 3792 0 R 3808 0 R 3823 0 R 3828 0 R 3831 0 R 3834 0 R 3840 0 R 3845 0 R 3847 0 R 3849 0 R 3851 0 R 3853 0 R 3855 0 R 3864 0 R 3868 0 R 3872 0 R 3876 0 R 3878 0 R 3885 0 R 3895 0 R 3902 0 R 3905 0 R 3908 0 R 3910 0 R 3917 0 R 
 3924 0 R 3934 0 R 3938 0 R 3943 0 R 3947 0 R 3950 0 R 3955 0 R 3958 0 R 3974 0 R 3978 0 R 4001 0 R 4005 0 R 4012 0 R 4023 0 R 4032 0 R 4034 0 R 4037 0 R 4040 0 R 4056 0 R 4062 0 R 4069 0 R]
+/Count 706
+/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 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 65 0 R 67 0 R 69 0 R 76 0 R 79 0 R 81 0 R 87 0 R 90 0 R 92 0 R 94 0 R 101 0 R 107 0 R 112 0 R 114 0 R 130 0 R 135 0 R 142 0 R 151 0 R 159 0 R 168 0 R 179 0 R 183 0 R 185 0 R 189 0 R 198 0 R 207 0 R 215 0 R 224 0 R 229 0 R 238 0 R 246 0 R 255 0 R 268 0 R 275 0 R 285 0 R 293 0 R 301 0 R 308 0 R 316 0 R 322 0 R 328 0 R 335 0 R 343 0 R 354 0 R 363 0 R 375 0 R 383 0 R 391 0 R 398 0 R 407 0 R 415 0 R 425 0 R 433 0 R 440 0 R 449 0 R 461 0 R 470 0 R 477 0 R 485 0 R 493 0 R 502 0 R 509 0 R 514 0 R 518 0 R 523 0 R 527 0 R 543 0 R 554 0 R 558 0 R 573 0 R 578 0 R 583 0 R 585 0 R 587 0 R 590 0 R 592 0 R 594 0 R 602 0 R 608 0 R 613 0 R 618 0 R 625 0 R 635 0 R 643 0 R 647 0 R 651 0 R 653 0 R 664 0 R 674 0 R 681 0 R 693 0 R 704 0 R 713 0 R 721 0 R 727 0 R 730 0 R 734 0 R 738 0 R 741 0 R 744 0 R 746 0 R 749 0 R 754 0 R 756 0 R 761 0 R 765 0 R 770 0 R 774 0 R 777 0 R 783 0 R 785 0 R 790 0 R 798 0 R 800 0 
 R 803 0 R 806 0 R 810 0 R 813 0 R 828 0 R 835 0 R 844 0 R 855 0 R 861 0 R 871 0 R 882 0 R 885 0 R 889 0 R 892 0 R 897 0 R 906 0 R 914 0 R 918 0 R 922 0 R 927 0 R 931 0 R 933 0 R 948 0 R 959 0 R 964 0 R 970 0 R 973 0 R 981 0 R 989 0 R 994 0 R 1000 0 R 1005 0 R 1007 0 R 1009 0 R 1011 0 R 1021 0 R 1029 0 R 1033 0 R 1040 0 R 1047 0 R 1055 0 R 1059 0 R 1065 0 R 1070 0 R 1078 0 R 1082 0 R 1087 0 R 1089 0 R 1095 0 R 1102 0 R 1104 0 R 1111 0 R 1122 0 R 1126 0 R 1128 0 R 1130 0 R 1134 0 R 1137 0 R 1142 0 R 1145 0 R 1157 0 R 1161 0 R 1167 0 R 1175 0 R 1180 0 R 1184 0 R 1188 0 R 1190 0 R 1193 0 R 1196 0 R 1199 0 R 1203 0 R 1207 0 R 1211 0 R 1216 0 R 1220 0 R 1223 0 R 1225 0 R 1235 0 R 1238 0 R 1246 0 R 1255 0 R 1261 0 R 1265 0 R 1267 0 R 1277 0 R 1280 0 R 1286 0 R 1295 0 R 1298 0 R 1305 0 R 1313 0 R 1315 0 R 1317 0 R 1326 0 R 1328 0 R 1330 0 R 1333 0 R 1335 0 R 1337 0 R 1339 0 R 1341 0 R 1344 0 R 1348 0 R 1353 0 R 1355 0 R 1357 0 R 1359 0 R 1364 0 R 1372 0 R 1377 0 R 1380 0 R 1382 0 R 1385 0 R
  1389 0 R 1393 0 R 1396 0 R 1398 0 R 1400 0 R 1403 0 R 1409 0 R 1414 0 R 1422 0 R 1436 0 R 1450 0 R 1454 0 R 1459 0 R 1472 0 R 1477 0 R 1492 0 R 1500 0 R 1504 0 R 1512 0 R 1527 0 R 1541 0 R 1553 0 R 1558 0 R 1564 0 R 1573 0 R 1579 0 R 1584 0 R 1592 0 R 1595 0 R 1605 0 R 1611 0 R 1614 0 R 1627 0 R 1629 0 R 1635 0 R 1639 0 R 1641 0 R 1649 0 R 1657 0 R 1661 0 R 1663 0 R 1665 0 R 1677 0 R 1683 0 R 1692 0 R 1698 0 R 1712 0 R 1717 0 R 1726 0 R 1734 0 R 1740 0 R 1745 0 R 1751 0 R 1754 0 R 1757 0 R 1762 0 R 1766 0 R 1773 0 R 1777 0 R 1782 0 R 1791 0 R 1796 0 R 1801 0 R 1803 0 R 1811 0 R 1818 0 R 1824 0 R 1829 0 R 1833 0 R 1836 0 R 1841 0 R 1846 0 R 1854 0 R 1856 0 R 1858 0 R 1861 0 R 1869 0 R 1872 0 R 1879 0 R 1888 0 R 1891 0 R 1896 0 R 1898 0 R 1901 0 R 1904 0 R 1907 0 R 1918 0 R 1923 0 R 1928 0 R 1930 0 R 1939 0 R 1946 0 R 1954 0 R 1960 0 R 1965 0 R 1967 0 R 1976 0 R 1985 0 R 1996 0 R 2002 0 R 2009 0 R 2011 0 R 2016 0 R 2018 0 R 2020 0 R 2023 0 R 2026 0 R 2029 0 R 2034 0 R 2038 0 R 2049 0
  R 2052 0 R 2057 0 R 2060 0 R 2062 0 R 2067 0 R 2077 0 R 2079 0 R 2081 0 R 2083 0 R 2085 0 R 2088 0 R 2090 0 R 2092 0 R 2095 0 R 2097 0 R 2099 0 R 2104 0 R 2109 0 R 2118 0 R 2120 0 R 2122 0 R 2129 0 R 2131 0 R 2136 0 R 2138 0 R 2140 0 R 2147 0 R 2152 0 R 2156 0 R 2160 0 R 2164 0 R 2166 0 R 2168 0 R 2172 0 R 2175 0 R 2177 0 R 2179 0 R 2183 0 R 2185 0 R 2188 0 R 2190 0 R 2192 0 R 2194 0 R 2201 0 R 2204 0 R 2209 0 R 2211 0 R 2213 0 R 2215 0 R 2217 0 R 2225 0 R 2236 0 R 2250 0 R 2261 0 R 2265 0 R 2271 0 R 2275 0 R 2278 0 R 2283 0 R 2288 0 R 2290 0 R 2293 0 R 2295 0 R 2297 0 R 2299 0 R 2304 0 R 2306 0 R 2319 0 R 2322 0 R 2330 0 R 2336 0 R 2348 0 R 2362 0 R 2375 0 R 2392 0 R 2396 0 R 2398 0 R 2402 0 R 2420 0 R 2427 0 R 2439 0 R 2443 0 R 2447 0 R 2456 0 R 2468 0 R 2473 0 R 2483 0 R 2496 0 R 2516 0 R 2525 0 R 2528 0 R 2537 0 R 2554 0 R 2561 0 R 2564 0 R 2569 0 R 2573 0 R 2576 0 R 2585 0 R 2593 0 R 2597 0 R 2599 0 R 2603 0 R 2617 0 R 2626 0 R 2631 0 R 2635 0 R 2638 0 R 2640 0 R 2642 0 R 2644
  0 R 2649 0 R 2662 0 R 2672 0 R 2680 0 R 2686 0 R 2692 0 R 2702 0 R 2709 0 R 2715 0 R 2717 0 R 2725 0 R 2734 0 R 2743 0 R 2748 0 R 2756 0 R 2760 0 R 2770 0 R 2778 0 R 2787 0 R 2792 0 R 2796 0 R 2800 0 R 2802 0 R 2808 0 R 2812 0 R 2816 0 R 2822 0 R 2828 0 R 2831 0 R 2837 0 R 2841 0 R 2851 0 R 2856 0 R 2861 0 R 2870 0 R 2876 0 R 2883 0 R 2886 0 R 2891 0 R 2897 0 R 2901 0 R 2904 0 R 2909 0 R 2919 0 R 2925 0 R 2927 0 R 2931 0 R 2938 0 R 2941 0 R 2951 0 R 2957 0 R 2966 0 R 2969 0 R 2979 0 R 2984 0 R 2988 0 R 2996 0 R 3002 0 R 3006 0 R 3008 0 R 3019 0 R 3024 0 R 3027 0 R 3029 0 R 3031 0 R 3041 0 R 3048 0 R 3052 0 R 3055 0 R 3061 0 R 3064 0 R 3067 0 R 3070 0 R 3077 0 R 3082 0 R 3088 0 R 3092 0 R 3095 0 R 3098 0 R 3100 0 R 3104 0 R 3115 0 R 3117 0 R 3121 0 R 3124 0 R 3128 0 R 3131 0 R 3135 0 R 3137 0 R 3150 0 R 3155 0 R 3160 0 R 3167 0 R 3176 0 R 3178 0 R 3186 0 R 3204 0 R 3216 0 R 3222 0 R 3238 0 R 3241 0 R 3246 0 R 3248 0 R 3256 0 R 3261 0 R 3264 0 R 3266 0 R 3268 0 R 3270 0 R 3273 0 R 32
 90 0 R 3293 0 R 3299 0 R 3305 0 R 3314 0 R 3320 0 R 3330 0 R 3341 0 R 3348 0 R 3357 0 R 3362 0 R 3365 0 R 3373 0 R 3377 0 R 3382 0 R 3387 0 R 3400 0 R 3403 0 R 3409 0 R 3414 0 R 3423 0 R 3432 0 R 3438 0 R 3451 0 R 3457 0 R 3461 0 R 3469 0 R 3473 0 R 3478 0 R 3480 0 R 3486 0 R 3493 0 R 3495 0 R 3502 0 R 3504 0 R 3512 0 R 3519 0 R 3525 0 R 3532 0 R 3542 0 R 3549 0 R 3561 0 R 3568 0 R 3581 0 R 3588 0 R 3590 0 R 3595 0 R 3608 0 R 3613 0 R 3619 0 R 3623 0 R 3626 0 R 3631 0 R 3633 0 R 3637 0 R 3639 0 R 3643 0 R 3646 0 R 3649 0 R 3657 0 R 3659 0 R 3663 0 R 3666 0 R 3673 0 R 3679 0 R 3683 0 R 3686 0 R 3688 0 R 3692 0 R 3697 0 R 3702 0 R 3705 0 R 3718 0 R 3723 0 R 3727 0 R 3730 0 R 3738 0 R 3742 0 R 3750 0 R 3755 0 R 3757 0 R 3763 0 R 3765 0 R 3770 0 R 3774 0 R 3779 0 R 3783 0 R 3796 0 R 3812 0 R 3827 0 R 3832 0 R 3835 0 R 3838 0 R 3844 0 R 3849 0 R 3851 0 R 3853 0 R 3855 0 R 3857 0 R 3859 0 R 3868 0 R 3872 0 R 3876 0 R 3880 0 R 3882 0 R 3889 0 R 3899 0 R 3906 0 R 3909 0 R 3912 0 R 3914 0 R 
 3921 0 R 3928 0 R 3938 0 R 3942 0 R 3947 0 R 3951 0 R 3954 0 R 3959 0 R 3962 0 R 3978 0 R 3982 0 R 4005 0 R 4009 0 R 4016 0 R 4027 0 R 4036 0 R 4038 0 R 4041 0 R 4044 0 R 4060 0 R 4066 0 R 4073 0 R]
 >>
 endobj
 4 0 obj
@@ -187,11 +187,11 @@ endobj
 << /Type /Font
 /BaseFont /71be00+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4740 0 R
+/FontDescriptor 4744 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4742 0 R
-/ToUnicode 4741 0 R
+/Widths 4746 0 R
+/ToUnicode 4745 0 R
 >>
 endobj
 11 0 obj
@@ -1750,7 +1750,7 @@ endobj
 /F1.0 10 0 R
 >>
 >>
-/Annots [4071 0 R 4072 0 R 4073 0 R 4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R 4081 0 R 4082 0 R 4083 0 R 4084 0 R 4085 0 R 4086 0 R 4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R 4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4098 0 R 4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R 4104 0 R 4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R 4112 0 R 4113 0 R 4114 0 R 4115 0 R 4116 0 R 4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R]
+/Annots [4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R 4081 0 R 4082 0 R 4083 0 R 4084 0 R 4085 0 R 4086 0 R 4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R 4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4098 0 R 4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R 4104 0 R 4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R 4112 0 R 4113 0 R 4114 0 R 4115 0 R 4116 0 R 4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R]
 >>
 endobj
 13 0 obj
@@ -3417,7 +3417,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R]
+/Annots [4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R]
 >>
 endobj
 15 0 obj
@@ -5084,7 +5084,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R]
+/Annots [4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R]
 >>
 endobj
 17 0 obj
@@ -6751,7 +6751,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R]
+/Annots [4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R]
 >>
 endobj
 19 0 obj
@@ -6956,7 +6956,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<353038> Tj
+<353039> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6996,7 +6996,7 @@ ET
 BT
 529.4315 702.276 Td
 /F1.0 10.5 Tf
-<353039> Tj
+<353130> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7036,7 +7036,7 @@ ET
 BT
 529.4315 683.796 Td
 /F1.0 10.5 Tf
-<353135> Tj
+<353136> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7076,7 +7076,7 @@ ET
 BT
 529.4315 665.316 Td
 /F1.0 10.5 Tf
-<353230> Tj
+<353231> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7116,7 +7116,7 @@ ET
 BT
 529.4315 646.836 Td
 /F1.0 10.5 Tf
-<353234> Tj
+<353235> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7156,7 +7156,7 @@ ET
 BT
 529.4315 628.356 Td
 /F1.0 10.5 Tf
-<353336> Tj
+<353337> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7196,7 +7196,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<353434> Tj
+<353435> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7236,7 +7236,7 @@ ET
 BT
 529.4315 591.396 Td
 /F1.0 10.5 Tf
-<353436> Tj
+<353437> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7276,7 +7276,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<353530> Tj
+<353531> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7316,7 +7316,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<353531> Tj
+<353532> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7356,7 +7356,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<353535> Tj
+<353536> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7396,7 +7396,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<353536> Tj
+<353537> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7436,7 +7436,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<353539> Tj
+<353630> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7476,7 +7476,7 @@ ET
 BT
 529.4315 480.516 Td
 /F1.0 10.5 Tf
-<353634> Tj
+<353635> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7516,7 +7516,7 @@ ET
 BT
 529.4315 462.036 Td
 /F1.0 10.5 Tf
-<353635> Tj
+<353636> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7556,7 +7556,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<353638> Tj
+<353639> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7596,7 +7596,7 @@ ET
 BT
 529.4315 425.076 Td
 /F1.0 10.5 Tf
-<353639> Tj
+<353730> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7636,7 +7636,7 @@ ET
 BT
 529.4315 406.596 Td
 /F1.0 10.5 Tf
-<353732> Tj
+<353733> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7676,7 +7676,7 @@ ET
 BT
 529.4315 388.116 Td
 /F1.0 10.5 Tf
-<353735> Tj
+<353736> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7716,7 +7716,7 @@ ET
 BT
 529.4315 369.636 Td
 /F1.0 10.5 Tf
-<353833> Tj
+<353834> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7756,7 +7756,7 @@ ET
 BT
 529.4315 351.156 Td
 /F1.0 10.5 Tf
-<353834> Tj
+<353835> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7807,7 +7807,7 @@ ET
 BT
 529.4315 332.676 Td
 /F1.0 10.5 Tf
-<353835> Tj
+<353836> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7847,7 +7847,7 @@ ET
 BT
 529.4315 314.196 Td
 /F1.0 10.5 Tf
-<353836> Tj
+<353837> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7887,7 +7887,7 @@ ET
 BT
 529.4315 295.716 Td
 /F1.0 10.5 Tf
-<363030> Tj
+<363031> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7927,7 +7927,7 @@ ET
 BT
 529.4315 277.236 Td
 /F1.0 10.5 Tf
-<363134> Tj
+<363135> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -7967,7 +7967,7 @@ ET
 BT
 529.4315 258.756 Td
 /F1.0 10.5 Tf
-<363135> Tj
+<363136> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8007,7 +8007,7 @@ ET
 BT
 529.4315 240.276 Td
 /F1.0 10.5 Tf
-<363137> Tj
+<363138> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8047,7 +8047,7 @@ ET
 BT
 529.4315 221.796 Td
 /F1.0 10.5 Tf
-<363139> Tj
+<363230> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8087,7 +8087,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<363231> Tj
+<363232> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8127,7 +8127,7 @@ ET
 BT
 529.4315 184.836 Td
 /F1.0 10.5 Tf
-<363233> Tj
+<363234> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8167,7 +8167,7 @@ ET
 BT
 529.4315 166.356 Td
 /F1.0 10.5 Tf
-<363234> Tj
+<363235> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8207,7 +8207,7 @@ ET
 BT
 529.4315 147.876 Td
 /F1.0 10.5 Tf
-<363236> Tj
+<363237> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8247,7 +8247,7 @@ ET
 BT
 529.4315 129.396 Td
 /F1.0 10.5 Tf
-<363238> Tj
+<363239> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8287,7 +8287,7 @@ ET
 BT
 529.4315 110.916 Td
 /F1.0 10.5 Tf
-<363239> Tj
+<363330> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8327,7 +8327,7 @@ ET
 BT
 529.4315 92.436 Td
 /F1.0 10.5 Tf
-<363336> Tj
+<363337> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8367,7 +8367,7 @@ ET
 BT
 529.4315 73.956 Td
 /F1.0 10.5 Tf
-<363337> Tj
+<363338> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8407,7 +8407,7 @@ ET
 BT
 529.4315 55.476 Td
 /F1.0 10.5 Tf
-<363338> Tj
+<363339> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8429,7 +8429,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R]
+/Annots [4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R]
 >>
 endobj
 21 0 obj
@@ -8474,7 +8474,7 @@ ET
 BT
 529.4315 794.676 Td
 /F1.0 10.5 Tf
-<363339> Tj
+<363430> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8514,7 +8514,7 @@ ET
 BT
 529.4315 776.196 Td
 /F1.0 10.5 Tf
-<363430> Tj
+<363431> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8554,7 +8554,7 @@ ET
 BT
 529.4315 757.716 Td
 /F1.0 10.5 Tf
-<363431> Tj
+<363432> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8594,7 +8594,7 @@ ET
 BT
 529.4315 739.236 Td
 /F1.0 10.5 Tf
-<363532> Tj
+<363533> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8634,7 +8634,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<363535> Tj
+<363536> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8674,7 +8674,7 @@ ET
 BT
 529.4315 702.276 Td
 /F1.0 10.5 Tf
-<363539> Tj
+<363630> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8714,7 +8714,7 @@ ET
 BT
 529.4315 683.796 Td
 /F1.0 10.5 Tf
-<363635> Tj
+<363636> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8754,7 +8754,7 @@ ET
 BT
 529.4315 665.316 Td
 /F1.0 10.5 Tf
-<363736> Tj
+<363737> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8794,7 +8794,7 @@ ET
 BT
 529.4315 646.836 Td
 /F1.0 10.5 Tf
-<363737> Tj
+<363738> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8834,7 +8834,7 @@ ET
 BT
 529.4315 628.356 Td
 /F1.0 10.5 Tf
-<363738> Tj
+<363739> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8874,7 +8874,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<363837> Tj
+<363838> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8914,7 +8914,7 @@ ET
 BT
 529.4315 591.396 Td
 /F1.0 10.5 Tf
-<363838> Tj
+<363839> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8954,7 +8954,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<363839> Tj
+<363930> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -8994,7 +8994,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<363930> Tj
+<363931> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9034,7 +9034,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<363931> Tj
+<363932> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9074,7 +9074,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<363933> Tj
+<363934> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9114,7 +9114,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<363934> Tj
+<363935> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9154,7 +9154,7 @@ ET
 BT
 529.4315 480.516 Td
 /F1.0 10.5 Tf
-<363935> Tj
+<363936> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -9176,7 +9176,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R]
+/Annots [4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R]
 >>
 endobj
 23 0 obj
@@ -9988,7 +9988,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [30 0 R 31 0 R 32 0 R 34 0 R 36 0 R 37 0 R 39 0 R 40 0 R 41 0 R]
@@ -10003,7 +10003,7 @@ endobj
 >>
 endobj
 27 0 obj
-<< /Kids [638 0 R 3548 0 R 1933 0 R 639 0 R 3472 0 R 1114 0 R 2463 0 R 3941 0 R]
+<< /Kids [638 0 R 3552 0 R 1933 0 R 639 0 R 3476 0 R 1114 0 R 2463 0 R 3945 0 R]
 >>
 endobj
 28 0 obj
@@ -10013,11 +10013,11 @@ endobj
 << /Type /Font
 /BaseFont /358635+NotoSerif-Bold
 /Subtype /TrueType
-/FontDescriptor 4744 0 R
+/FontDescriptor 4748 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4746 0 R
-/ToUnicode 4745 0 R
+/Widths 4750 0 R
+/ToUnicode 4749 0 R
 >>
 endobj
 30 0 obj
@@ -10057,11 +10057,11 @@ endobj
 << /Type /Font
 /BaseFont /260f03+NotoSerif-Italic
 /Subtype /TrueType
-/FontDescriptor 4748 0 R
+/FontDescriptor 4752 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4750 0 R
-/ToUnicode 4749 0 R
+/Widths 4754 0 R
+/ToUnicode 4753 0 R
 >>
 endobj
 34 0 obj
@@ -10079,11 +10079,11 @@ endobj
 << /Type /Font
 /BaseFont /c7d210+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 4752 0 R
+/FontDescriptor 4756 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4754 0 R
-/ToUnicode 4753 0 R
+/Widths 4758 0 R
+/ToUnicode 4757 0 R
 >>
 endobj
 36 0 obj
@@ -10109,11 +10109,11 @@ endobj
 << /Type /Font
 /BaseFont /34c70d+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4756 0 R
+/FontDescriptor 4760 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4758 0 R
-/ToUnicode 4757 0 R
+/Widths 4762 0 R
+/ToUnicode 4761 0 R
 >>
 endobj
 39 0 obj
@@ -10547,7 +10547,7 @@ endobj
 /F5.1 45 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -10556,11 +10556,11 @@ endobj
 << /Type /Font
 /BaseFont /26ec65+FontAwesome
 /Subtype /TrueType
-/FontDescriptor 4760 0 R
+/FontDescriptor 4764 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4762 0 R
-/ToUnicode 4761 0 R
+/Widths 4766 0 R
+/ToUnicode 4765 0 R
 >>
 endobj
 46 0 obj
@@ -10618,7 +10618,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -10703,7 +10703,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [52 0 R]
@@ -12276,7 +12276,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [57 0 R 59 0 R]
@@ -13554,7 +13554,7 @@ endobj
 /F1.0 10 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [62 0 R]
@@ -14415,7 +14415,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -15134,7 +15134,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -16010,7 +16010,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [71 0 R 72 0 R 73 0 R 74 0 R]
@@ -16955,7 +16955,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [77 0 R]
@@ -17878,7 +17878,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -19389,7 +19389,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [82 0 R 84 0 R]
@@ -20737,7 +20737,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [88 0 R]
@@ -21811,7 +21811,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -22495,7 +22495,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -23286,7 +23286,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [95 0 R 96 0 R 97 0 R 99 0 R]
@@ -23515,7 +23515,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [103 0 R 104 0 R 105 0 R]
@@ -24379,7 +24379,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [109 0 R 110 0 R]
@@ -24659,7 +24659,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -26139,7 +26139,7 @@ endobj
 /F5.1 45 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 125 0 R 126 0 R 127 0 R 128 0 R]
@@ -27206,7 +27206,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [131 0 R 133 0 R]
@@ -27944,7 +27944,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [136 0 R 138 0 R 139 0 R 140 0 R]
@@ -30350,7 +30350,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R]
@@ -31166,7 +31166,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [155 0 R 156 0 R]
@@ -31177,12 +31177,12 @@ endobj
 endobj
 153 0 obj
 << /Limits [(__anchor-top) (api-as-of-hbase-1-0-0)]
-/Names [(__anchor-top) 25 0 R (__indexterm-7334094) 3437 0 R (__indexterm-7336498) 3439 0 R (__indexterm-7338046) 3441 0 R (__indexterm-7340230) 3442 0 R (acid) 893 0 R (acl) 3249 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3541 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3542 0 R (add.metrics) 3539 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3776 0 R (adding.new.node) 2999 0 R (administration) 1331 0 R (administration-2) 1351 0 R (administration-3) 1383 0 R (all-service-rollback) 644 0 R (allow-the-hbase-system-user-in-yarn) 1925 0 R (amazon-ec2) 3814 0 R (api-as-of-hbase-1-0-0) 1430 0 R]
+/Names [(__anchor-top) 25 0 R (__indexterm-7339802) 3441 0 R (__indexterm-7342206) 3443 0 R (__indexterm-7343754) 3445 0 R (__indexterm-7345938) 3446 0 R (acid) 893 0 R (acl) 3253 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3545 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3546 0 R (add.metrics) 3543 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3780 0 R (adding.new.node) 3004 0 R (administration) 1331 0 R (administration-2) 1351 0 R (administration-3) 1383 0 R (all-service-rollback) 644 0 R (allow-the-hbase-system-user-in-yarn) 1925 0 R (amazon-ec2) 3818 0 R (api-as-of-hbase-1-0-0) 1430 0 R]
 >>
 endobj
 154 0 obj
 << /Limits [(io.storefile.bloom.block.size) (jdo)]
-/Names [(io.storefile.bloom.block.size) 351 0 R (irc) 3280 0 R (isolate-system-tables) 3246 0 R (java) 116 0 R (java-2) 1865 0 R (java-3) 1870 0 R (java.client.config) 511 0 R (jdk-issues) 2823 0 R (jdk-version-requirements) 56 0 R (jdo) 2110 0 R]
+/Names [(io.storefile.bloom.block.size) 351 0 R (irc) 3284 0 R (isolate-system-tables) 3250 0 R (java) 116 0 R (java-2) 1865 0 R (java-3) 1870 0 R (java.client.config) 511 0 R (jdk-issues) 2823 0 R (jdk-version-requirements) 56 0 R (jdo) 2110 0 R]
 >>
 endobj
 155 0 obj
@@ -32321,7 +32321,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [161 0 R 162 0 R 164 0 R]
@@ -33121,7 +33121,7 @@ endobj
 /F5.1 45 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [169 0 R 170 0 R 171 0 R 173 0 R 174 0 R 176 0 R 177 0 R]
@@ -34593,7 +34593,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [180 0 R 181 0 R]
@@ -35018,7 +35018,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -35674,7 +35674,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [187 0 R]
@@ -36441,7 +36441,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [192 0 R]
@@ -36972,7 +36972,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -36988,7 +36988,7 @@ endobj
 endobj
 202 0 obj
 << /Limits [(getshortmidpointkey-an-optimization-for-data-index-block) (handling-of-errors-during-log-splitting)]
-/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 3956 0 R (getting.involved) 3270 0 R (getting_started) 48 0 R (git.best.practices) 3543 0 R (git.patch.flow) 3593 0 R (goals) 4048 0 R (guide-for-hbase-committers) 3570 0 R (guidelines-for-deploying-a-coprocessor) 2300 0 R (guidelines-for-reporting-effective-issues) 3287 0 R (hadoop) 137 0 R (hadoop.native.lib) 3874 0 R (hadoop.policy.file) 378 0 R (handling-of-errors-during-log-splitting) 1612 0 R]
+/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 3960 0 R (getting.involved) 3274 0 R (getting_started) 48 0 R (git.best.practices) 3547 0 R (git.patch.flow) 3597 0 R (goals) 4052 0 R (guide-for-hbase-committers) 3574 0 R (guidelines-for-deploying-a-coprocessor) 2300 0 R (guidelines-for-reporting-effective-issues) 3291 0 R (hadoop) 137 0 R (hadoop.native.lib) 3878 0 R (hadoop.policy.file) 378 0 R (handling-of-errors-during-log-splitting) 1612 0 R]
 >>
 endobj
 203 0 obj
@@ -37518,7 +37518,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -38040,7 +38040,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -38675,7 +38675,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -39184,7 +39184,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -39715,7 +39715,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -40294,7 +40294,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [248 0 R 249 0 R]
@@ -40861,7 +40861,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [257 0 R 258 0 R 260 0 R 261 0 R]
@@ -40925,7 +40925,7 @@ endobj
 endobj
 264 0 obj
 << /Limits [(hbase.table.lock.enable) (hbase.tmp.dir)]
-/Names [(hbase.table.lock.enable) 403 0 R (hbase.table.max.rowsize) 404 0 R (hbase.tags) 1306 0 R (hbase.tests) 3420 0 R (hbase.tests.categories) 3462 0 R (hbase.tests.cluster) 3466 0 R (hbase.tests.example.code) 3467 0 R (hbase.tests.rules) 3460 0 R (hbase.tests.sleeps) 3463 0 R (hbase.tests.writing) 3459 0 R (hbase.thrift.maxQueuedRequests) 410 0 R (hbase.thrift.maxWorkerThreads) 409 0 R (hbase.thrift.minWorkerThreads) 408 0 R (hbase.tmp.dir) 194 0 R]
+/Names [(hbase.table.lock.enable) 403 0 R (hbase.table.max.rowsize) 404 0 R (hbase.tags) 1306 0 R (hbase.tests) 3424 0 R (hbase.tests.categories) 3466 0 R (hbase.tests.cluster) 3470 0 R (hbase.tests.example.code) 3471 0 R (hbase.tests.rules) 3464 0 R (hbase.tests.sleeps) 3467 0 R (hbase.tests.writing) 3463 0 R (hbase.thrift.maxQueuedRequests) 410 0 R (hbase.thrift.maxWorkerThreads) 409 0 R (hbase.thrift.minWorkerThreads) 408 0 R (hbase.tmp.dir) 194 0 R]
 >>
 endobj
 265 0 obj
@@ -41481,7 +41481,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -42076,7 +42076,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [281 0 R 282 0 R]
@@ -42096,7 +42096,7 @@ endobj
 endobj
 280 0 obj
 << /Limits [(hbase.cluster.distributed) (hbase.data.umask.enable)]
-/Names [(hbase.cluster.distributed) 196 0 R (hbase.column.max.version) 429 0 R (hbase.commit.msg.format) 3720 0 R (hbase.coordinated.state.manager.class) 472 0 R (hbase.coprocessor.abortonerror) 394 0 R (hbase.coprocessor.enabled) 387 0 R (hbase.coprocessor.master.classes) 393 0 R (hbase.coprocessor.region.classes) 392 0 R (hbase.coprocessor.user.enabled) 389 0 R (hbase.data.umask) 420 0 R (hbase.data.umask.enable) 419 0 R]
+/Names [(hbase.cluster.distributed) 196 0 R (hbase.column.max.version) 429 0 R (hbase.commit.msg.format) 3724 0 R (hbase.coordinated.state.manager.class) 472 0 R (hbase.coprocessor.abortonerror) 394 0 R (hbase.coprocessor.enabled) 387 0 R (hbase.coprocessor.master.classes) 393 0 R (hbase.coprocessor.region.classes) 392 0 R (hbase.coprocessor.user.enabled) 389 0 R (hbase.data.umask) 420 0 R (hbase.data.umask.enable) 419 0 R]
 >>
 endobj
 281 0 obj
@@ -42642,7 +42642,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -43137,7 +43137,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -43709,7 +43709,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -44274,7 +44274,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -44879,7 +44879,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -45476,7 +45476,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -46019,7 +46019,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -46530,7 +46530,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -47105,7 +47105,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [345 0 R 349 0 R]
@@ -47153,7 +47153,7 @@ endobj
 endobj
 352 0 obj
 << /Limits [(quota) (regions.arch)]
-/Names [(quota) 3105 0 R (read-api-and-usage) 1866 0 R (read-hbase-shell-commands-from-a-command-file) 742 0 R (reading-filtering-and-sending-edits) 3085 0 R (reading_cells_with_labels) 1360 0 R (recommended.configurations.hdfs) 541 0 R (recommended_configurations) 536 0 R (recommended_configurations.zk) 537 0 R (region-overlap-repairs) 3832 0 R (region-replication-for-meta-table-s-region) 1844 0 R (regions.arch) 1642 0 R]
+/Names [(quota) 3109 0 R (read-api-and-usage) 1866 0 R (read-hbase-shell-commands-from-a-command-file) 742 0 R (reading-filtering-and-sending-edits) 3089 0 R (reading_cells_with_labels) 1360 0 R (recommended.configurations.hdfs) 541 0 R (recommended_configurations) 536 0 R (recommended_configurations.zk) 537 0 R (region-overlap-repairs) 3836 0 R (region-replication-for-meta-table-s-region) 1844 0 R (regions.arch) 1642 0 R]
 >>
 endobj
 353 0 obj
@@ -47686,7 +47686,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -47713,7 +47713,7 @@ endobj
 endobj
 361 0 obj
 << /Limits [(hbase.regionserver.thrift.compact) (hbase.rootdir.perms)]
-/Names [(hbase.regionserver.thrift.compact) 413 0 R (hbase.regionserver.thrift.framed) 411 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 412 0 R (hbase.replication.management) 3061 0 R (hbase.replication.rpc.codec) 481 0 R (hbase.replication.source.maxthreads) 482 0 R (hbase.rest-csrf.browser-useragents-regex) 465 0 R (hbase.rest.csrf.enabled) 464 0 R (hbase.rest.filter.classes) 452 0 R (hbase.rest.port) 395 0 R (hbase.rest.readonly) 396 0 R (hbase.rest.support.proxyuser) 401 0 R (hbase.rest.threads.max) 399 0 R (hbase.rest.threads.min) 400 0 R (hbase.rolling.restart) 630 0 R (hbase.rolling.upgrade) 626 0 R (hbase.rootdir) 195 0 R (hbase.rootdir.perms) 416 0 R]
+/Names [(hbase.regionserver.thrift.compact) 413 0 R (hbase.regionserver.thrift.framed) 411 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 412 0 R (hbase.replication.management) 3065 0 R (hbase.replication.rpc.codec) 481 0 R (hbase.replication.source.maxthreads) 482 0 R (hbase.rest-csrf.browser-useragents-regex) 465 0 R (hbase.rest.csrf.enabled) 464 0 R (hbase.rest.filter.classes) 452 0 R (hbase.rest.port) 395 0 R (hbase.rest.readonly) 396 0 R (hbase.rest.support.proxyuser) 401 0 R (hbase.rest.threads.max) 399 0 R (hbase.rest.threads.min) 400 0 R (hbase.rolling.restart) 630 0 R (hbase.rolling.upgrade) 626 0 R (hbase.rootdir) 195 0 R (hbase.rootdir.perms) 416 0 R]
 >>
 endobj
 362 0 obj
@@ -48301,7 +48301,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [365 0 R 366 0 R 368 0 R 370 0 R 371 0 R]
@@ -48876,7 +48876,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -49425,7 +49425,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -49972,7 +49972,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -50491,7 +50491,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -50516,7 +50516,7 @@ endobj
 endobj
 405 0 obj
 << /Limits [(hbase.zookeeper.property.maxClientCnxns) (hfile.block.index.cacheonwrite)]
-/Names [(hbase.zookeeper.property.maxClientCnxns) 269 0 R (hbase.zookeeper.property.syncLimit) 263 0 R (hbase.zookeeper.quorum) 199 0 R (hbase_apis) 2053 0 R (hbase_default_configurations) 193 0 R (hbase_env) 525 0 R (hbase_metrics) 3004 0 R (hbase_mob) 1880 0 R (hbase_site) 521 0 R (hbase_supported_tested_definitions) 42 0 R (hbck) 2906 0 R (hbck.in.depth) 3824 0 R (health.check) 2902 0 R (hedged.reads) 2520 0 R (hfile) 1699 0 R (hfile-format) 1700 0 R (hfile-format-2) 3925 0 R (hfile.block.bloom.cacheonwrite) 350 0 R (hfile.block.cache.size) 339 0 R (hfile.block.index.cacheonwrite) 340 0 R]
+/Names [(hbase.zookeeper.property.maxClientCnxns) 269 0 R (hbase.zookeeper.property.syncLimit) 263 0 R (hbase.zookeeper.quorum) 199 0 R (hbase_apis) 2053 0 R (hbase_default_configurations) 193 0 R (hbase_env) 525 0 R (hbase_metrics) 3009 0 R (hbase_mob) 1880 0 R (hbase_site) 521 0 R (hbase_supported_tested_definitions) 42 0 R (hbck) 2910 0 R (hbck.in.depth) 3828 0 R (health.check) 2906 0 R (hedged.reads) 2520 0 R (hfile) 1699 0 R (hfile-format) 1700 0 R (hfile-format-2) 3929 0 R (hfile.block.bloom.cacheonwrite) 350 0 R (hfile.block.cache.size) 339 0 R (hfile.block.index.cacheonwrite) 340 0 R]
 >>
 endobj
 406 0 obj
@@ -51010,7 +51010,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -51520,7 +51520,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -51530,7 +51530,7 @@ endobj
 endobj
 417 0 obj
 << /Limits [(hbase.rpc) (hbase.secure.spnego.ui)]
-/Names [(hbase.rpc) 4041 0 R (hbase.rpc.rows.warning.threshold) 504 0 R (hbase.rpc.shortoperation.timeout) 360 0 R (hbase.rpc.timeout) 356 0 R (hbase.rs.cacheblocksonwrite) 355 0 R (hbase.secure.bulkload) 1386 0 R (hbase.secure.configuration) 1226 0 R (hbase.secure.enable) 1390 0 R (hbase.secure.simpleconfiguration) 1268 0 R (hbase.secure.spnego.ui) 1221 0 R]
+/Names [(hbase.rpc) 4045 0 R (hbase.rpc.rows.warning.threshold) 504 0 R (hbase.rpc.shortoperation.timeout) 360 0 R (hbase.rpc.timeout) 356 0 R (hbase.rs.cacheblocksonwrite) 355 0 R (hbase.secure.bulkload) 1386 0 R (hbase.secure.configuration) 1226 0 R (hbase.secure.enable) 1390 0 R (hbase.secure.simpleconfiguration) 1268 0 R (hbase.secure.spnego.ui) 1221 0 R]
 >>
 endobj
 418 0 obj
@@ -52046,7 +52046,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -52607,7 +52607,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -53107,7 +53107,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -53652,7 +53652,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [455 0 R 456 0 R]
@@ -54326,7 +54326,7 @@ endobj
 /F4.0 35 0 R
 /F6.0 466 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [462 0 R 463 0 R]
@@ -54364,11 +54364,11 @@ endobj
 << /Type /Font
 /BaseFont /066905+mplus1mn-bold
 /Subtype /TrueType
-/FontDescriptor 4764 0 R
+/FontDescriptor 4768 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4766 0 R
-/ToUnicode 4765 0 R
+/Widths 4770 0 R
+/ToUnicode 4769 0 R
 >>
 endobj
 467 0 obj
@@ -54930,7 +54930,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -54943,7 +54943,7 @@ endobj
 endobj
 473 0 obj
 << /Limits [(hbase.defaults.for.version.skip) (hbase.hregion.percolumnfamilyflush.size.lower.bound.min)]
-/Names [(hbase.defaults.for.version.skip) 402 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 434 0 R (hbase.display.keys) 386 0 R (hbase.dynamic.jars.dir) 450 0 R (hbase.encryption.server) 1374 0 R (hbase.env.sh) 506 0 R (hbase.fix.version.in.jira) 3708 0 R (hbase.history) 4002 0 R (hbase.hregion.majorcompaction) 309 0 R (hbase.hregion.majorcompaction.jitter) 310 0 R (hbase.hregion.max.filesize) 306 0 R (hbase.hregion.memstore.block.multiplier) 304 0 R (hbase.hregion.memstore.flush.size) 299 0 R (hbase.hregion.memstore.mslab.enabled) 305 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 302 0 R]
+/Names [(hbase.defaults.for.version.skip) 402 0 R (hbase.dfs.client.read.shortcircuit.buffer.size) 434 0 R (hbase.display.keys) 386 0 R (hbase.dynamic.jars.dir) 450 0 R (hbase.encryption.server) 1374 0 R (hbase.env.sh) 506 0 R (hbase.fix.version.in.jira) 3712 0 R (hbase.history) 4006 0 R (hbase.hregion.majorcompaction) 309 0 R (hbase.hregion.majorcompaction.jitter) 310 0 R (hbase.hregion.max.filesize) 306 0 R (hbase.hregion.memstore.block.multiplier) 304 0 R (hbase.hregion.memstore.flush.size) 299 0 R (hbase.hregion.memstore.mslab.enabled) 305 0 R (hbase.hregion.percolumnfamilyflush.size.lower.bound.min) 302 0 R]
 >>
 endobj
 474 0 obj
@@ -55474,7 +55474,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -55985,7 +55985,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -56488,7 +56488,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -56504,7 +56504,7 @@ endobj
 endobj
 497 0 obj
 << /Limits [(hbase.mob.compaction.threads.max) (hbase.org)]
-/Names [(hbase.mob.compaction.threads.max) 499 0 R (hbase.mob.compactor.class) 498 0 R (hbase.mob.delfile.max.count) 494 0 R (hbase.mob.file.cache.size) 487 0 R (hbase.moduletest.run) 3429 0 R (hbase.moduletest.shell) 3424 0 R (hbase.moduletests) 3422 0 R (hbase.normalizer.period) 295 0 R (hbase.offpeak.end.hour) 330 0 R (hbase.offpeak.start.hour) 329 0 R (hbase.org) 3411 0 R]
+/Names [(hbase.mob.compaction.threads.max) 499 0 R (hbase.mob.compactor.class) 498 0 R (hbase.mob.delfile.max.count) 494 0 R (hbase.mob.file.cache.size) 487 0 R (hbase.moduletest.run) 3433 0 R (hbase.moduletest.shell) 3428 0 R (hbase.moduletests) 3426 0 R (hbase.normalizer.period) 295 0 R (hbase.offpeak.end.hour) 330 0 R (hbase.offpeak.start.hour) 329 0 R (hbase.org) 3415 0 R]
 >>
 endobj
 498 0 obj
@@ -56990,7 +56990,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -58143,7 +58143,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [512 0 R]
@@ -58922,7 +58922,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [515 0 R]
@@ -60379,7 +60379,7 @@ endobj
 /F3.0 33 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -60903,7 +60903,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -61556,7 +61556,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [530 0 R 531 0 R 533 0 R 534 0 R 535 0 R 540 0 R]
@@ -62311,7 +62311,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [546 0 R 549 0 R 552 0 R]
@@ -62350,7 +62350,7 @@ endobj
 endobj
 551 0 obj
 << /Limits [(configuration) (coprocessor-overview)]
-/Names [(configuration) 102 0 R (configuration-2) 3033 0 R (configuration-3) 3795 0 R (configuration-files) 108 0 R (configuration-from-scratch) 3689 0 R (configuration-properties) 1850 0 R (configuring-columns-for-mob) 1885 0 R (configuring-server-wide-behavior-of-bloom-filters) 2424 0 R (configuring-the-rest-server-and-client) 2072 0 R (confirm) 186 0 R (connection-setup) 4053 0 R (constraints) 1030 0 R (contributing-to-documentation-or-other-strings) 3731 0 R (coprocessor-implementation-overview) 2229 0 R (coprocessor-overview) 2226 0 R]
+/Names [(configuration) 102 0 R (configuration-2) 3038 0 R (configuration-3) 3799 0 R (configuration-files) 108 0 R (configuration-from-scratch) 3693 0 R (configuration-properties) 1850 0 R (configuring-columns-for-mob) 1885 0 R (configuring-server-wide-behavior-of-bloom-filters) 2424 0 R (configuring-the-rest-server-and-client) 2072 0 R (confirm) 186 0 R (connection-setup) 4057 0 R (constraints) 1030 0 R (contributing-to-documentation-or-other-strings) 3735 0 R (coprocessor-implementation-overview) 2229 0 R (coprocessor-overview) 2226 0 R]
 >>
 endobj
 552 0 obj
@@ -63212,7 +63212,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [556 0 R]
@@ -64026,7 +64026,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [560 0 R 561 0 R 562 0 R 566 0 R 569 0 R 570 0 R 571 0 R]
@@ -64768,7 +64768,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [575 0 R 576 0 R]
@@ -66200,7 +66200,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [580 0 R 581 0 R]
@@ -66977,7 +66977,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -67678,7 +67678,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -69009,7 +69009,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -70504,7 +70504,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -70670,7 +70670,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -70868,7 +70868,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [596 0 R 597 0 R 598 0 R 599 0 R 600 0 R]
@@ -71622,7 +71622,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [605 0 R]
@@ -72565,7 +72565,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [609 0 R 610 0 R 611 0 R]
@@ -74953,7 +74953,7 @@ endobj
 /F1.1 38 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [615 0 R 616 0 R]
@@ -75838,7 +75838,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [619 0 R]
@@ -76312,7 +76312,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [627 0 R 628 0 R 629 0 R 631 0 R 632 0 R 633 0 R]
@@ -77104,7 +77104,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [641 0 R]
@@ -77115,17 +77115,17 @@ endobj
 endobj
 637 0 obj
 << /Limits [(standalone.over.hdfs) (table)]
-/Names [(standalone.over.hdfs) 165 0 R (standalone_dist) 160 0 R (starting-and-stopping-the-rest-server) 2071 0 R (static-loading) 2263 0 R (static-unloading) 2266 0 R (store) 1693 0 R (store-file-ttl) 1843 0 R (store.file.dir) 1708 0 R (store.memstore) 1694 0 R (storefile-refresher) 1839 0 R (submit_doc_patch_procedure) 3732 0 R (submitting.patches) 3549 0 R (submitting.patches.create) 3554 0 R (submitting.patches.tests) 3560 0 R (supported.datatypes) 982 0 R (table) 801 0 R]
+/Names [(standalone.over.hdfs) 165 0 R (standalone_dist) 160 0 R (starting-and-stopping-the-rest-server) 2071 0 R (static-loading) 2263 0 R (static-unloading) 2266 0 R (store) 1693 0 R (store-file-ttl) 1843 0 R (store.file.dir) 1708 0 R (store.memstore) 1694 0 R (storefile-refresher) 1839 0 R (submit_doc_patch_procedure) 3736 0 R (submitting.patches) 3553 0 R (submitting.patches.create) 3558 0 R (submitting.patches.tests) 3564 0 R (supported.datatypes) 982 0 R (table) 801 0 R]
 >>
 endobj
 638 0 obj
 << /Limits [(__anchor-top) (build.thrift)]
-/Kids [153 0 R 3250 0 R 1452 0 R 1932 0 R 1405 0 R 2512 0 R 1951 0 R 1989 0 R 1972 0 R 1909 0 R]
+/Kids [153 0 R 3254 0 R 1452 0 R 1932 0 R 1405 0 R 2512 0 R 1951 0 R 1989 0 R 1972 0 R 1909 0 R]
 >>
 endobj
 639 0 obj
 << /Limits [(hbase.mob.compaction.threads.max) (hbase.zookeeper.property.initLimit)]
-/Kids [497 0 R 3425 0 R 459 0 R 235 0 R 361 0 R 417 0 R 4042 0 R 447 0 R 264 0 R 3461 0 R 3432 0 R]
+/Kids [497 0 R 3429 0 R 459 0 R 235 0 R 361 0 R 417 0 R 4046 0 R 447 0 R 264 0 R 3465 0 R 3436 0 R]
 >>
 endobj
 640 0 obj
@@ -77789,7 +77789,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -78504,7 +78504,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [649 0 R]
@@ -78971,7 +78971,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -79695,7 +79695,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -80908,7 +80908,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -81699,7 +81699,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [678 0 R]
@@ -82393,7 +82393,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [685 0 R]
@@ -83391,7 +83391,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [696 0 R]
@@ -83419,7 +83419,7 @@ endobj
 endobj
 698 0 obj
 << /Limits [(upgrade2.0.rolling.upgrades) (user-interface)]
-/Names [(upgrade2.0.rolling.upgrades) 710 0 R (upgrade2.0.shaded.client.preferred) 707 0 R (upgrade2.0.shaded.client.preferred) 702 0 R (upgrade2.0.ui.splitmerge.by.row) 689 0 R (upgrade2.0.zkconfig) 683 0 R (upgrade2.0.zkconfig) 661 0 R (upgrading) 595 0 R (upgrading-2) 3789 0 R (use-cases-for-observer-coprocessors) 2241 0 R (user-interface) 1862 0 R]
+/Names [(upgrade2.0.rolling.upgrades) 710 0 R (upgrade2.0.shaded.client.preferred) 707 0 R (upgrade2.0.shaded.client.preferred) 702 0 R (upgrade2.0.ui.splitmerge.by.row) 689 0 R (upgrade2.0.zkconfig) 683 0 R (upgrade2.0.zkconfig) 661 0 R (upgrading) 595 0 R (upgrading-2) 3793 0 R (use-cases-for-observer-coprocessors) 2241 0 R (user-interface) 1862 0 R]
 >>
 endobj
 699 0 obj
@@ -84123,7 +84123,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -84682,7 +84682,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -85050,7 +85050,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [723 0 R 724 0 R 725 0 R]
@@ -85251,7 +85251,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -85489,7 +85489,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [732 0 R]
@@ -86085,7 +86085,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [736 0 R]
@@ -86622,7 +86622,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -86899,7 +86899,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -87383,7 +87383,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -87658,7 +87658,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -88173,7 +88173,7 @@ endobj
 /F4.0 35 0 R
 /F7.0 752 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -88188,11 +88188,11 @@ endobj
 << /Type /Font
 /BaseFont /9a0a42+mplus-1p-regular
 /Subtype /TrueType
-/FontDescriptor 4768 0 R
+/FontDescriptor 4772 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4770 0 R
-/ToUnicode 4769 0 R
+/Widths 4774 0 R
+/ToUnicode 4773 0 R
 >>
 endobj
 753 0 obj
@@ -88869,7 +88869,7 @@ endobj
 /F1.0 10 0 R
 /F7.0 752 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -89498,7 +89498,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [759 0 R]
@@ -90654,7 +90654,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -95914,7 +95914,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -96290,7 +96290,7 @@ endobj
 /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -96905,7 +96905,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -99446,7 +99446,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [779 0 R 780 0 R 781 0 R]
@@ -102465,7 +102465,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -103899,7 +103899,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [788 0 R]
@@ -103910,7 +103910,7 @@ endobj
 endobj
 787 0 obj
 << /Limits [(namespace) (number.of.cfs.card)]
-/Names [(namespace) 791 0 R (namespace_creation) 795 0 R (namespace_quotas) 3114 0 R (namespace_special) 796 0 R (network-saturation-the-winner) 2854 0 R (new-committers) 3571 0 R (new.version.behavior) 869 0 R (no.permanent.state.in.zk) 3712 0 R (node.management) 2976 0 R (non-root-block-index-format-in-version-2) 3948 0 R (normalizer) 3253 0 R (nosuchmethoderror-java-util-concurrent-concurrenthashmap-keyset) 2824 0 R (notes) 4067 0 R (number.of.cfs) 923 0 R (number.of.cfs.card) 925 0 R]
+/Names [(namespace) 791 0 R (namespace_creation) 795 0 R (namespace_quotas) 3118 0 R (namespace_special) 796 0 R (network-saturation-the-winner) 2854 0 R (new-committers) 3575 0 R (new.version.behavior) 869 0 R (no.permanent.state.in.zk) 3716 0 R (node.management) 2980 0 R (non-root-block-index-format-in-version-2) 3952 0 R (normalizer) 3257 0 R (nosuchmethoderror-java-util-concurrent-concurrenthashmap-keyset) 2824 0 R (notes) 4071 0 R (number.of.cfs) 923 0 R (number.of.cfs.card) 925 0 R]
 >>
 endobj
 788 0 obj
@@ -104688,7 +104688,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [792 0 R 793 0 R 794 0 R]
@@ -104890,7 +104890,7 @@ endobj
 /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -104961,7 +104961,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -105065,7 +105065,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -105482,7 +105482,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -105492,7 +105492,7 @@ endobj
 endobj
 808 0 obj
 << /Limits [(changing.compression) (client.external)]
-/Names [(changing.compression) 3900 0 R (changing.rowkeys) 967 0 R (chaos.monkey.properties) 3493 0 R (checking-for-success-or-failure-in-scripts) 739 0 R (choosing-region-servers-to-replicate-to) 3080 0 R (cleaning-logs) 3086 0 R (client) 4054 0 R (client-side-configuration-for-secure-operation) 1232 0 R (client-side-configuration-for-secure-operation-rest-gateway) 1257 0 R (client-side-configuration-for-simple-user-access-operation) 1278 0 R (client-side-configuration-for-simple-user-access-operation-rest-gateway) 1283 0 R (client-side-configuration-for-simple-user-access-operation-thrift-gateway) 1281 0 R (client-side-properties) 1859 0 R (client.connection.pooling) 1438 0 R (client.connections) 1427 0 R (client.external) 1455 0 R]
+/Names [(changing.compression) 3904 0 R (changing.rowkeys) 967 0 R (chaos.monkey.properties) 3497 0 R (checking-for-success-or-failure-in-scripts) 739 0 R (choosing-region-servers-to-replicate-to) 3084 0 R (cleaning-logs) 3090 0 R (client) 4058 0 R (client-side-configuration-for-secure-operation) 1232 0 R (client-side-configuration-for-secure-operation-rest-gateway) 1257 0 R (client-side-configuration-for-simple-user-access-operation) 1278 0 R (client-side-configuration-for-simple-user-access-operation-rest-gateway) 1283 0 R (client-side-configuration-for-simple-user-access-operation-thrift-gateway) 1281 0 R (client-side-properties) 1859 0 R (client.connection.pooling) 1438 0 R (client.connections) 1427 0 R (client.external) 1455 0 R]
 >>
 endobj
 809 0 obj
@@ -105607,7 +105607,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -107794,7 +107794,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [816 0 R 818 0 R 819 0 R 821 0 R 822 0 R 823 0 R 825 0 R 826 0 R]
@@ -107805,7 +107805,7 @@ endobj
 endobj
 815 0 obj
 << /Limits [(dfs.datanode.max.transfer.threads) (dyn_config)]
-/Names [(dfs.datanode.max.transfer.threads) 152 0 R (dfs.domain.socket.path) 431 0 R (dialog) 3599 0 R (direct.memory) 1576 0 R (disable-nagle-for-rpc) 1092 0 R (disable.splitting) 555 0 R (disabling-metrics) 3011 0 R (disabling.blockcache) 567 0 R (discovering.available.metrics) 3012 0 R (distributed) 166 0 R (distributed.log.replay.failure.reasons) 1633 0 R (distributed.log.splitting) 1622 0 R (dm.column.metadata) 886 0 R (dm.sort) 883 0 R (do-not-edit-jira-comments) 3600 0 R (document-the-backup-and-restore-strategy-and-ideally-log-information-about-each-backup) 2007 0 R (documentation) 3406 0 R (draining.servers) 2982 0 R (driver) 2903 0 R (dyn_config) 588 0 R]
+/Names [(dfs.datanode.max.transfer.threads) 152 0 R (dfs.domain.socket.path) 431 0 R (dialog) 3603 0 R (direct.memory) 1576 0 R (disable-nagle-for-rpc) 1092 0 R (disable.splitting) 555 0 R (disabling-metrics) 3016 0 R (disabling.blockcache) 567 0 R (discovering.available.metrics) 3017 0 R (distributed) 166 0 R (distributed.log.replay.failure.reasons) 1633 0 R (distributed.log.splitting) 1622 0 R (dm.column.metadata) 886 0 R (dm.sort) 883 0 R (do-not-edit-jira-comments) 3604 0 R (document-the-backup-and-restore-strategy-and-ideally-log-information-about-each-backup) 2007 0 R (documentation) 3410 0 R (draining.servers) 2986 0 R (driver) 2907 0 R (dyn_config) 588 0 R]
 >>
 endobj
 816 0 obj
@@ -108128,7 +108128,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [830 0 R 831 0 R 832 0 R 833 0 R]
@@ -109143,7 +109143,7 @@ endobj
 /F7.0 752 0 R
 /F7.1 842 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [837 0 R 838 0 R 841 0 R]
@@ -109179,7 +109179,7 @@ endobj
 endobj
 840 0 obj
 << /Limits [(rowcounter) (save-the-dataframe)]
-/Names [(rowcounter) 2948 0 R (rowcounter-example) 1162 0 R (rowkey.design) 928 0 R (rowkey.regionsplits) 968 0 R (rowkey.scope) 966 0 R (rpc) 4050 0 R (rpc.configs) 4070 0 R (rpc.logging) 2591 0 R (rs.failover.details) 3089 0 R (rs_metrics) 3020 0 R (rsgroup) 3238 0 R (run-canary-test-as-daemon-mode) 2893 0 R (run.insitu) 3536 0 R (running-canary-in-a-kerberos-enabled-cluster) 2899 0 R (running-hbck-to-identify-inconsistencies) 3825 0 R (running-multiple-workloads-on-a-single-cluster) 3101 0 R (running-the-shell-in-non-interactive-mode) 731 0 R (save-the-dataframe) 2199 0 R]
+/Names [(rowcounter) 2952 0 R (rowcounter-example) 1162 0 R (rowkey.design) 928 0 R (rowkey.regionsplits) 968 0 R (rowkey.scope) 966 0 R (rpc) 4054 0 R (rpc.configs) 4074 0 R (rpc.logging) 2591 0 R (rs.failover.details) 3093 0 R (rs_metrics) 3025 0 R (rsgroup) 3242 0 R (run-canary-test-as-daemon-mode) 2893 0 R (run.insitu) 3540 0 R (running-canary-in-a-kerberos-enabled-cluster) 2899 0 R (running-hbck-to-identify-inconsistencies) 3829 0 R (running-multiple-workloads-on-a-single-cluster) 3105 0 R (running-the-shell-in-non-interactive-mode) 731 0 R (save-the-dataframe) 2199 0 R]
 >>
 endobj
 841 0 obj
@@ -109197,11 +109197,11 @@ endobj
 << /Type /Font
 /BaseFont /a99fc7+mplus-1p-regular
 /Subtype /TrueType
-/FontDescriptor 4772 0 R
+/FontDescriptor 4776 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4774 0 R
-/ToUnicode 4773 0 R
+/Widths 4778 0 R
+/ToUnicode 4777 0 R
 >>
 endobj
 843 0 obj
@@ -111069,7 +111069,7 @@ endobj
 /F7.1 842 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [845 0 R 846 0 R 849 0 R 850 0 R 851 0 R 852 0 R]
@@ -115005,7 +115005,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -115987,7 +115987,7 @@ endobj
 /F1.1 38 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R]
@@ -116879,7 +116879,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [872 0 R 873 0 R 875 0 R 876 0 R 878 0 R 880 0 R]
@@ -117044,7 +117044,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -117211,7 +117211,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [887 0 R]
@@ -117440,7 +117440,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -117558,7 +117558,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [894 0 R 895 0 R]
@@ -117971,7 +117971,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R]
@@ -119446,7 +119446,7 @@ endobj
 /F4.0 35 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [908 0 R 909 0 R 910 0 R 912 0 R]
@@ -119966,7 +119966,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [916 0 R]
@@ -120183,7 +120183,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [920 0 R]
@@ -120500,7 +120500,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [924 0 R]
@@ -120916,7 +120916,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -121645,7 +121645,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -122578,7 +122578,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [934 0 R 935 0 R 936 0 R 937 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 945 0 R 946 0 R]
@@ -123203,7 +123203,7 @@ endobj
 /F2.0 29 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [949 0 R 950 0 R 951 0 R 953 0 R 955 0 R]
@@ -126784,7 +126784,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [961 0 R 962 0 R]
@@ -127502,7 +127502,7 @@ endobj
 /F2.0 29 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [965 0 R]
@@ -131274,7 +131274,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [971 0 R]
@@ -131747,7 +131747,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [976 0 R 977 0 R 979 0 R]
@@ -132127,7 +132127,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [983 0 R 984 0 R 985 0 R 987 0 R]
@@ -132268,7 +132268,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [992 0 R]
@@ -132279,7 +132279,7 @@ endobj
 endobj
 991 0 obj
 << /Limits [(schema.versions) (sect.zookeeper.session.timeout)]
-/Names [(schema.versions) 974 0 R (schema.versions.max) 975 0 R (scopes) 3842 0 R (scripting) 728 0 R (secondary-replica-failover) 1849 0 R (secondary.indexes) 1012 0 R (secondary.indexes.coproc) 1026 0 R (secondary.indexes.dualwrite) 1022 0 R (secondary.indexes.filter) 1016 0 R (secondary.indexes.periodic) 1018 0 R (secondary.indexes.summary) 1024 0 R (sect.zookeeper.session.timeout) 538 0 R]
+/Names [(schema.versions) 974 0 R (schema.versions.max) 975 0 R (scopes) 3846 0 R (scripting) 728 0 R (secondary-replica-failover) 1849 0 R (secondary.indexes) 1012 0 R (secondary.indexes.coproc) 1026 0 R (secondary.indexes.dualwrite) 1022 0 R (secondary.indexes.filter) 1016 0 R (secondary.indexes.periodic) 1018 0 R (secondary.indexes.summary) 1024 0 R (sect.zookeeper.session.timeout) 538 0 R]
 >>
 endobj
 992 0 obj
@@ -132705,7 +132705,7 @@ endobj
 /F3.0 33 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [997 0 R 998 0 R]
@@ -132716,7 +132716,7 @@ endobj
 endobj
 996 0 obj
 << /Limits [(tune-hbase-server-rpc-handling) (unit.tests)]
-/Names [(tune-hbase-server-rpc-handling) 1091 0 R (tune-jvm-gc-for-low-collection-latencies) 1098 0 R (tuning-code-callqueue-code-options) 2393 0 R (types-of-coprocessors) 2237 0 R (types-of-observer-coprocessor) 2243 0 R (ulimit) 132 0 R (understanding-access-levels) 1311 0 R (unexpected-filesystem-growth) 2713 0 R (unified-version-2-block-format) 3939 0 R (unit.tests) 3610 0 R]
+/Names [(tune-hbase-server-rpc-handling) 1091 0 R (tune-jvm-gc-for-low-collection-latencies) 1098 0 R (tuning-code-callqueue-code-options) 2393 0 R (types-of-coprocessors) 2237 0 R (types-of-observer-coprocessor) 2243 0 R (ulimit) 132 0 R (understanding-access-levels) 1311 0 R (unexpected-filesystem-growth) 2713 0 R (unified-version-2-block-format) 3943 0 R (unit.tests) 3614 0 R]
 >>
 endobj
 997 0 obj
@@ -133428,7 +133428,7 @@ endobj
 /F7.0 752 0 R
 /F7.1 842 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1002 0 R 1003 0 R]
@@ -139143,7 +139143,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -145089,7 +145089,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -146175,7 +146175,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -146861,7 +146861,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1013 0 R 1014 0 R 1015 0 R 1017 0 R 1019 0 R]
@@ -147166,7 +147166,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1023 0 R 1025 0 R 1027 0 R]
@@ -147374,7 +147374,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1031 0 R]
@@ -148170,7 +148170,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1035 0 R 1038 0 R]
@@ -149148,7 +149148,7 @@ endobj
 /F5.1 45 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1043 0 R 1044 0 R]
@@ -149828,7 +149828,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1048 0 R 1050 0 R 1051 0 R 1052 0 R]
@@ -150581,7 +150581,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1056 0 R]
@@ -151217,7 +151217,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1063 0 R]
@@ -152021,7 +152021,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1067 0 R]
@@ -152584,7 +152584,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1072 0 R]
@@ -154143,7 +154143,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1079 0 R]
@@ -154887,7 +154887,7 @@ endobj
 /F2.0 29 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1083 0 R 1084 0 R 1085 0 R]
@@ -155055,7 +155055,7 @@ endobj
 /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
 /Font << /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -156201,7 +156201,7 @@ endobj
 /F4.0 35 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -157302,7 +157302,7 @@ endobj
 /F1.1 38 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -157321,7 +157321,7 @@ endobj
 endobj
 1100 0 obj
 << /Limits [(others) (perf.general)]
-/Names [(others) 2207 0 R (output) 3037 0 R (owner) 3716 0 R (package) 3331 0 R (page-allocation-failure) 2818 0 R (passing-vm-options-to-the-shell) 747 0 R (passwordless.ssh.quickstart) 85 0 R (patchplusonepolicy) 3704 0 R (perf.99th.percentile) 2365 0 R (perf.batch.loading) 2449 0 R (perf.casestudy) 2570 0 R (perf.compactions.and.splits) 2366 0 R (perf.compression) 2434 0 R (perf.compression.however) 2437 0 R (perf.configurations) 2363 0 R (perf.deleting) 2529 0 R (perf.deleting.queue) 2530 0 R (perf.deleting.rpc) 2534 0 R (perf.ec2) 2562 0 R (perf.general) 2444 0 R]
+/Names [(others) 2207 0 R (output) 3042 0 R (owner) 3720 0 R (package) 3335 0 R (page-allocation-failure) 2818 0 R (passing-vm-options-to-the-shell) 747 0 R (passwordless.ssh.quickstart) 85 0 R (patchplusonepolicy) 3708 0 R (perf.99th.percentile) 2365 0 R (perf.batch.loading) 2449 0 R (perf.casestudy) 2570 0 R (perf.compactions.and.splits) 2366 0 R (perf.compression) 2434 0 R (perf.compression.however) 2437 0 R (perf.configurations) 2363 0 R (perf.deleting) 2529 0 R (perf.deleting.queue) 2530 0 R (perf.deleting.rpc) 2534 0 R (perf.ec2) 2562 0 R (perf.general) 2444 0 R]
 >>
 endobj
 1101 0 obj
@@ -157490,7 +157490,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -158327,7 +158327,7 @@ endobj
 /F1.1 38 0 R
 /F7.0 752 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1109 0 R]
@@ -158875,7 +158875,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R]
@@ -158886,12 +158886,12 @@ endobj
 endobj
 1113 0 obj
 << /Limits [(keysize.patterns) (load_coprocessor_in_shell)]
-/Names [(keysize.patterns) 957 0 R (keysize.row) 956 0 R (keyvalue) 1714 0 R (keyvalue.example) 1715 0 R (language-integrated-query) 2205 0 R (lb) 2981 0 R (life-of-a-wal-edit) 3070 0 R (limit-server-failure-impact) 1093 0 R (load-the-dataframe) 2202 0 R (load_coprocessor_in_shell) 2269 0 R]
+/Names [(keysize.patterns) 957 0 R (keysize.row) 956 0 R (keyvalue) 1714 0 R (keyvalue.example) 1715 0 R (language-integrated-query) 2205 0 R (lb) 2985 0 R (life-of-a-wal-edit) 3074 0 R (limit-server-failure-impact) 1093 0 R (load-the-dataframe) 2202 0 R (load_coprocessor_in_shell) 2269 0 R]
 >>
 endobj
 1114 0 obj
 << /Limits [(namespace) (schema.updates)]
-/Kids [787 0 R 3139 0 R 3202 0 R 1789 0 R 3161 0 R 2971 0 R 1100 0 R 2462 0 R 2498 0 R 2367 0 R 2475 0 R 2326 0 R 352 0 R 3106 0 R 1536 0 R 4060 0 R 3054 0 R 840 0 R 2949 0 R 1062 0 R]
+/Kids [787 0 R 3143 0 R 3206 0 R 1789 0 R 3165 0 R 2975 0 R 1100 0 R 2462 0 R 2498 0 R 2367 0 R 2475 0 R 2326 0 R 352 0 R 3110 0 R 1536 0 R 4063 0 R 2998 0 R 840 0 R 2953 0 R 1062 0 R]
 >>
 endobj
 1115 0 obj
@@ -159965,7 +159965,7 @@ endobj
 /F3.0 33 0 R
 /F1.1 38 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1124 0 R]
@@ -160592,7 +160592,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -160922,7 +160922,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -161675,7 +161675,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1131 0 R 1132 0 R]
@@ -162113,7 +162113,7 @@ endobj
 /Font << /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1135 0 R]
@@ -162641,7 +162641,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1139 0 R 1140 0 R]
@@ -162955,7 +162955,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -163707,7 +163707,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R]
@@ -163944,7 +163944,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1159 0 R]
@@ -164253,7 +164253,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1163 0 R 1164 0 R 1165 0 R]
@@ -164505,7 +164505,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1170 0 R 1173 0 R]
@@ -167061,7 +167061,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1178 0 R]
@@ -169318,7 +169318,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1182 0 R]
@@ -171274,7 +171274,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -175275,7 +175275,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -177534,7 +177534,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -180989,7 +180989,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -182596,7 +182596,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -183760,7 +183760,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -183917,7 +183917,7 @@ endobj
 /Font << /F2.0 29 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1205 0 R]
@@ -187375,7 +187375,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1209 0 R]
@@ -187730,7 +187730,7 @@ endobj
 /F3.0 33 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1213 0 R 1214 0 R]
@@ -188349,7 +188349,7 @@ endobj
 /F3.0 33 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1218 0 R]
@@ -188939,7 +188939,7 @@ endobj
 /F4.0 35 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -189735,7 +189735,7 @@ endobj
 /Font << /F4.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -190583,7 +190583,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1227 0 R 1228 0 R 1231 0 R 1233 0 R]
@@ -192288,7 +192288,7 @@ endobj
 /F4.0 35 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 >>
@@ -193423,7 +193423,7 @@ endobj
 /F2.0 29 0 R
 /F5.1 45 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1240 0 R 1242 0 R 1243 0 R 1244 0 R]
@@ -193433,11 +193433,11 @@ endobj
 << /Type /Font
 /BaseFont /294f18+mplus1mn-italic
 /Subtype /TrueType
-/FontDescriptor 4776 0 R
+/FontDescriptor 4780 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4778 0 R
-/ToUnicode 4777 0 R
+/Widths 4782 0 R
+/ToUnicode 4781 0 R
 >>
 endobj
 1240 0 obj
@@ -194648,7 +194648,7 @@ endobj
 /F2.0 29 0 R
 /F6.0 466 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1247 0 R 1248 0 R 1249 0 R 1250 0 R 1252 0 R 1253 0 R]
@@ -195879,7 +195879,7 @@ endobj
 /F3.0 33 0 R
 /F8.0 1239 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1256 0 R 1258 0 R 1259 0 R]
@@ -196905,7 +196905,7 @@ endobj
 /F3.0 33 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1262 0 R]
@@ -197830,7 +197830,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 33 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -198191,7 +198191,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1269 0 R 1270 0 R 1272 0 R 1273 0 R]
@@ -199342,7 +199342,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 >>
@@ -200364,7 +200364,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 29 0 R
 >>
-/XObject << /Stamp1 4513 0 R
+/XObject << /Stamp1 4517 0 R
 >>
 >>
 /Annots [1282 0 R 1284 0 R]
@@ -201131,7 +201131,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 35 0 R
 >>
-/XObject << /Stamp2 4514 0 R
+/XObject << /Stamp2 4518 0 R
 >>
 >>
 /Annots [1290 0 R 1291 0 R 1292 0 R]
@@ -201142,7 +201142,7 @@ endobj
 endobj
 1288 0 obj
 << /Limits [(shell-2) (space-quotas)]
-/Names [(shell-2) 1864 0 R (shell-3) 1867 0 R (shell-debug-switch) 767 0 R (shell-tricks) 750 0 R (shell_exercises) 63 0 R (simple-versus-secure-access) 1271 0 R (slack) 3277 0 R (slowness-due-to-high-processor-usage) 2853 0 R (snappy.compression.installation) 3893 0 R (snapshot-errors-due-to-reverse-dns) 2757 0 R (snapshots_azure) 3175 0 R (snapshots_s

<TRUNCATED>

[22/25] hbase-site git commit: Published site at c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 a1cc42b..7666acb 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -346,11 +346,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.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/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/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/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.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/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.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 e602642..2d4a29c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -209,8 +209,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.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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 4008d34..216a427 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -441,19 +441,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/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 dd6b06d..e7c672c 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -212,11 +212,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/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/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/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/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/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 e7cad82..7a0f9d1 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -228,12 +228,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.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/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/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/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/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/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 fd5d8a0..952aa32 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -704,20 +704,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/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/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/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/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/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/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/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.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/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/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/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/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/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/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/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/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/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 5efcbb8..732825f 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -199,8 +199,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/839437ee/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index c20ff47..034077c 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,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.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 bf7ef69..d9fa142 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -137,8 +137,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.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 </ul>
 </li>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/snapshot/CreateSnapshot.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/CreateSnapshot.html b/devapidocs/org/apache/hadoop/hbase/snapshot/CreateSnapshot.html
index 4039f9d..12a92aa 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/CreateSnapshot.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/CreateSnapshot.html
@@ -220,7 +220,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.h
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run
 </a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, 
 <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index 289b168..00efef3 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -440,7 +440,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoo
 p.conf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</
 a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
index d28eae0..e2ae5d3 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
@@ -364,7 +364,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.h
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoo
 p.conf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</
 a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 0ebeeb0..8e41b8e 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,9 +198,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/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/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/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/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 776cd91..8c0d861 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.909">Canary.Monitor</a>
+<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.908">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>
 </li>
@@ -273,7 +273,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.911">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.910">connection</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -282,7 +282,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.912">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.911">admin</a></pre>
 </li>
 </ul>
 <a name="targets">
@@ -291,7 +291,7 @@ 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.913">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.912">targets</a></pre>
 </li>
 </ul>
 <a name="useRegExp">
@@ -300,7 +300,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.914">useRegExp</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.913">useRegExp</a></pre>
 </li>
 </ul>
 <a name="treatFailureAsError">
@@ -309,7 +309,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.915">treatFailureAsError</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.914">treatFailureAsError</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -318,7 +318,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.916">initialized</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.915">initialized</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -327,7 +327,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.918">done</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.917">done</a></pre>
 </li>
 </ul>
 <a name="errorCode">
@@ -336,7 +336,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.919">errorCode</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.918">errorCode</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -345,7 +345,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.920">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.919">sink</a></pre>
 </li>
 </ul>
 <a name="executor">
@@ -354,7 +354,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.921">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.920">executor</a></pre>
 </li>
 </ul>
 </li>
@@ -371,7 +371,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.948">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.947">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,
@@ -393,7 +393,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.923">isDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.922">isDone</a>()</pre>
 </li>
 </ul>
 <a name="hasError--">
@@ -402,7 +402,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.927">hasError</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.926">hasError</a>()</pre>
 </li>
 </ul>
 <a name="finalCheckForErrors--">
@@ -411,7 +411,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.931">finalCheckForErrors</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.930">finalCheckForErrors</a>()</pre>
 </li>
 </ul>
 <a name="close--">
@@ -420,7 +420,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.944">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.943">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>
@@ -438,7 +438,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.961">run</a>()</pre>
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.960">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>
@@ -451,7 +451,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.963">initAdmin</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.962">initAdmin</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 07fb1d9..8dec379 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.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.980">Canary.RegionMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.979">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>
 </li>
 </ul>
@@ -298,7 +298,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.982">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.981">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>
@@ -311,7 +311,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.984">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.983">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>
@@ -324,7 +324,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.986">lastCheckTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.985">lastCheckTime</a></pre>
 </li>
 </ul>
 <a name="writeSniffing">
@@ -333,7 +333,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.987">writeSniffing</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.986">writeSniffing</a></pre>
 </li>
 </ul>
 <a name="writeTableName">
@@ -342,7 +342,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.988">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.987">writeTableName</a></pre>
 </li>
 </ul>
 <a name="writeDataTTL">
@@ -351,7 +351,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.989">writeDataTTL</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.988">writeDataTTL</a></pre>
 </li>
 </ul>
 <a name="regionsLowerLimit">
@@ -360,7 +360,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.990">regionsLowerLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.989">regionsLowerLimit</a></pre>
 </li>
 </ul>
 <a name="regionsUpperLimit">
@@ -369,7 +369,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.991">regionsUpperLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.990">regionsUpperLimit</a></pre>
 </li>
 </ul>
 <a name="checkPeriod">
@@ -378,7 +378,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.992">checkPeriod</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.991">checkPeriod</a></pre>
 </li>
 </ul>
 <a name="rawScanEnabled">
@@ -387,7 +387,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.993">rawScanEnabled</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.992">rawScanEnabled</a></pre>
 </li>
 </ul>
 <a name="configuredReadTableTimeouts">
@@ -396,7 +396,7 @@ 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.994">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.993">configuredReadTableTimeouts</a></pre>
 </li>
 </ul>
 <a name="configuredWriteTableTimeout">
@@ -405,7 +405,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.995">configuredWriteTableTimeout</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.994">configuredWriteTableTimeout</a></pre>
 </li>
 </ul>
 </li>
@@ -422,7 +422,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <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.997">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.996">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,
@@ -448,7 +448,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.1018">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.1017">getSink</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -457,7 +457,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.1026">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1025">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>
@@ -472,7 +472,7 @@ 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.1107">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.1106">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="throwsLabel">Throws:</span></dt>
@@ -486,7 +486,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.1153">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.1152">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>
@@ -501,7 +501,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.1168">checkWriteTableDistribution</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1167">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>
@@ -515,7 +515,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.1208">createWriteTable</a>(int&nbsp;numberOfServers)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1207">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>


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span c

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        admin.

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        admin.enableTable(writeTableName);<a name="line.1178"></a>
+<

<TRUNCATED>

[23/25] hbase-site git commit: Published site at c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index 555a256..2965ee7 100644
--- a/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -237,7 +237,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/apidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html b/apidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
index 33b3f8a..c97e4f4 100644
--- a/apidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
+++ b/apidocs/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
@@ -241,7 +241,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/apidocs/org/apache/hadoop/hbase/util/RegionMover.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/util/RegionMover.html b/apidocs/org/apache/hadoop/hbase/util/RegionMover.html
index 691d5cb..fa6e7dc 100644
--- a/apidocs/org/apache/hadoop/hbase/util/RegionMover.html
+++ b/apidocs/org/apache/hadoop/hbase/util/RegionMover.html
@@ -237,7 +237,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 6606c1b..7854e62 100644
--- a/book.html
+++ b/book.html
@@ -25656,6 +25656,7 @@ Some commands take arguments. Pass no args or -h for usage.
   pe              Run PerformanceEvaluation
   ltt             Run LoadTestTool
   canary          Run the Canary tool
+  regionsplitter  Run the RegionSplitter tool
   version         Print the version
   CLASSNAME       Run the class named CLASSNAME</pre>
 </div>
@@ -25668,13 +25669,13 @@ Others, such as <code>hbase shell</code> (<a href="#shell">The Apache HBase Shel
 <h3 id="_canary"><a class="anchor" href="#_canary"></a>144.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>
+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 org.apache.hadoop.hbase.tool.Canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]
+Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]
  where [opts] are:
    -help          Show this help and exit.
    -regionserver  replace the table argument to regionserver,
@@ -25821,11 +25822,11 @@ This daemon will stop itself and return non-zero error code if any error occurs,
 </div>
 </div>
 <div class="paragraph">
-<p>Run repeatedly with internal 5 seconds and will not stop itself even if errors occur in the test.</p>
+<p>Run repeatedly with 5 second intervals and will not stop itself even if errors occur in the test.</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>$ ${HBASE_HOME}/bin/hbase canary -daemon -interval 50000 -f false</pre>
+<pre>$ ${HBASE_HOME}/bin/hbase canary -daemon -interval 5 -f false</pre>
 </div>
 </div>
 </div>
@@ -25838,7 +25839,7 @@ This run sets the timeout value to 60 seconds, the default value is 600 seconds.
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>$ ${HBASE_HOME}/bin/hbase canary -t 600000</pre>
+<pre>$ ${HBASE_HOME}/bin/hbase canary -t 60000</pre>
 </div>
 </div>
 </div>
@@ -25879,7 +25880,7 @@ exit code.</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>$ ${HBASE_HOME}/bin/hbase canary --treatFailureAsError</pre>
+<pre>$ ${HBASE_HOME}/bin/hbase canary -treatFailureAsError</pre>
 </div>
 </div>
 </div>
@@ -25931,7 +25932,7 @@ exit code.</p>
   <span class="tag">&lt;value&gt;</span>/etc/hbase/conf/keytab.krb5<span class="tag">&lt;/value&gt;</span>
 <span class="tag">&lt;/property&gt;</span>
 <span class="comment">&lt;!-- optional params --&gt;</span>
-property<span class="error">&gt;</span>
+<span class="tag">&lt;property&gt;</span>
   <span class="tag">&lt;name&gt;</span>hbase.client.dns.interface<span class="tag">&lt;/name&gt;</span>
   <span class="tag">&lt;value&gt;</span>default<span class="tag">&lt;/value&gt;</span>
 <span class="tag">&lt;/property&gt;</span>
@@ -25946,14 +25947,46 @@ property<span class="error">&gt;</span>
 </div>
 </div>
 <div class="sect2">
-<h3 id="health.check"><a class="anchor" href="#health.check"></a>144.2. Health Checker</h3>
+<h3 id="_regionsplitter"><a class="anchor" href="#_regionsplitter"></a>144.2. RegionSplitter</h3>
+<div class="listingblock">
+<div class="content">
+<pre>usage: bin/hbase regionsplitter &lt;TABLE&gt; &lt;SPLITALGORITHM&gt;
+SPLITALGORITHM is the java class name of a class implementing
+                      SplitAlgorithm, or one of the special strings
+                      HexStringSplit or DecimalStringSplit or
+                      UniformSplit, which are built-in split algorithms.
+                      HexStringSplit treats keys as hexadecimal ASCII, and
+                      DecimalStringSplit treats keys as decimal ASCII, and
+                      UniformSplit treats keys as arbitrary bytes.
+ -c &lt;region count&gt;        Create a new table with a pre-split number of
+                          regions
+ -D &lt;property=value&gt;      Override HBase Configuration Settings
+ -f &lt;family:family:...&gt;   Column Families to create with new table.
+                          Required with -c
+    --firstrow &lt;arg&gt;      First Row in Table for Split Algorithm
+ -h                       Print this usage help
+    --lastrow &lt;arg&gt;       Last Row in Table for Split Algorithm
+ -o &lt;count&gt;               Max outstanding splits that have unfinished
+                          major compactions
+ -r                       Perform a rolling split of an existing region
+    --risky               Skip verification steps to complete
+                          quickly. STRONGLY DISCOURAGED for production
+                          systems.</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For additional detail, see <a href="#manual_region_splitting_decisions">Manual Region Splitting</a>.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="health.check"><a class="anchor" href="#health.check"></a>144.3. Health Checker</h3>
 <div class="paragraph">
 <p>You can configure HBase to run a script periodically and if it fails N times (configurable), have the server exit.
 See <em>HBASE-7351 Periodic health check script</em> for configurations and detail.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_driver"><a class="anchor" href="#_driver"></a>144.3. Driver</h3>
+<h3 id="_driver"><a class="anchor" href="#_driver"></a>144.4. Driver</h3>
 <div class="paragraph">
 <p>Several frequently-accessed utilities are provided as <code>Driver</code> classes, and executed by the <em>bin/hbase</em> command.
 These utilities represent MapReduce jobs which run on your cluster.
@@ -26011,7 +26044,7 @@ Note that this command is in a different package than the others.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="hbck"><a class="anchor" href="#hbck"></a>144.4. HBase <code>hbck</code></h3>
+<h3 id="hbck"><a class="anchor" href="#hbck"></a>144.5. HBase <code>hbck</code></h3>
 <div class="paragraph">
 <p>To run <code>hbck</code> against your HBase cluster run <code>$./bin/hbase hbck</code>. At the end of the command&#8217;s output it prints <code>OK</code> or <code>INCONSISTENCY</code>.
 If your cluster reports inconsistencies, pass <code>-details</code> to see more detail emitted.
@@ -26023,15 +26056,15 @@ If inconsistencies, run <code>hbck</code> a few times because the inconsistency
 </div>
 </div>
 <div class="sect2">
-<h3 id="hfile_tool2"><a class="anchor" href="#hfile_tool2"></a>144.5. HFile Tool</h3>
+<h3 id="hfile_tool2"><a class="anchor" href="#hfile_tool2"></a>144.6. HFile Tool</h3>
 <div class="paragraph">
 <p>See <a href="#hfile_tool">HFile Tool</a>.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_wal_tools"><a class="anchor" href="#_wal_tools"></a>144.6. WAL Tools</h3>
+<h3 id="_wal_tools"><a class="anchor" href="#_wal_tools"></a>144.7. WAL Tools</h3>
 <div class="sect3">
-<h4 id="hlog_tool"><a class="anchor" href="#hlog_tool"></a>144.6.1. FSHLog tool</h4>
+<h4 id="hlog_tool"><a class="anchor" href="#hlog_tool"></a>144.7.1. FSHLog tool</h4>
 <div class="paragraph">
 <p>The main method on <code>FSHLog</code> offers manual split and dump facilities.
 Pass it WALs or the product of a split, the content of the <em>recovered.edits</em>.
@@ -26092,13 +26125,13 @@ In those versions, you can print the contents of a WAL using the same configurat
 </div>
 </div>
 <div class="sect2">
-<h3 id="compression.tool"><a class="anchor" href="#compression.tool"></a>144.7. Compression Tool</h3>
+<h3 id="compression.tool"><a class="anchor" href="#compression.tool"></a>144.8. Compression Tool</h3>
 <div class="paragraph">
 <p>See <a href="#compression.test">compression.test</a>.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="copy.table"><a class="anchor" href="#copy.table"></a>144.8. CopyTable</h3>
+<h3 id="copy.table"><a class="anchor" href="#copy.table"></a>144.9. CopyTable</h3>
 <div class="paragraph">
 <p>CopyTable is a utility that can copy part or of all of a table, either to the same cluster or another cluster.
 The target table must first exist.
@@ -26180,7 +26213,7 @@ For performance consider the following general options:
 </div>
 </div>
 <div class="sect2">
-<h3 id="export"><a class="anchor" href="#export"></a>144.9. Export</h3>
+<h3 id="export"><a class="anchor" href="#export"></a>144.10. Export</h3>
 <div class="paragraph">
 <p>Export is a utility that will dump the contents of table to HDFS in a sequence file.
 The Export can be run via a Coprocessor Endpoint or MapReduce. Invoke via:</p>
@@ -26281,7 +26314,7 @@ specifying column families and applying filters during the export.
 </div>
 </div>
 <div class="sect2">
-<h3 id="import"><a class="anchor" href="#import"></a>144.10. Import</h3>
+<h3 id="import"><a class="anchor" href="#import"></a>144.11. Import</h3>
 <div class="paragraph">
 <p>Import is a utility that will load data that has been exported back into HBase.
 Invoke via:</p>
@@ -26313,7 +26346,7 @@ To see usage instructions, run the command with no options.
 </div>
 </div>
 <div class="sect2">
-<h3 id="importtsv"><a class="anchor" href="#importtsv"></a>144.11. ImportTsv</h3>
+<h3 id="importtsv"><a class="anchor" href="#importtsv"></a>144.12. ImportTsv</h3>
 <div class="paragraph">
 <p>ImportTsv is a utility that will load data in TSV format into HBase.
 It has two distinct usages: loading data from TSV format in HDFS into HBase via Puts, and preparing StoreFiles to be loaded via the <code>completebulkload</code>.</p>
@@ -26338,7 +26371,7 @@ It has two distinct usages: loading data from TSV format in HDFS into HBase via
 <p>These generated StoreFiles can be loaded into HBase via <a href="#completebulkload">completebulkload</a>.</p>
 </div>
 <div class="sect3">
-<h4 id="importtsv.options"><a class="anchor" href="#importtsv.options"></a>144.11.1. ImportTsv Options</h4>
+<h4 id="importtsv.options"><a class="anchor" href="#importtsv.options"></a>144.12.1. ImportTsv Options</h4>
 <div class="paragraph">
 <p>Running <code>ImportTsv</code> with no arguments prints brief usage information:</p>
 </div>
@@ -26370,7 +26403,7 @@ Other options that may be specified with -D include:
 </div>
 </div>
 <div class="sect3">
-<h4 id="importtsv.example"><a class="anchor" href="#importtsv.example"></a>144.11.2. ImportTsv Example</h4>
+<h4 id="importtsv.example"><a class="anchor" href="#importtsv.example"></a>144.12.2. ImportTsv Example</h4>
 <div class="paragraph">
 <p>For example, assume that we are loading data into a table called 'datatsv' with a ColumnFamily called 'd' with two columns "c1" and "c2".</p>
 </div>
@@ -26405,20 +26438,20 @@ The second and third columns in the file will be imported as "d:c1" and "d:c2",
 </div>
 </div>
 <div class="sect3">
-<h4 id="importtsv.warning"><a class="anchor" href="#importtsv.warning"></a>144.11.3. ImportTsv Warning</h4>
+<h4 id="importtsv.warning"><a class="anchor" href="#importtsv.warning"></a>144.12.3. ImportTsv Warning</h4>
 <div class="paragraph">
 <p>If you have preparing a lot of data for bulk loading, make sure the target HBase table is pre-split appropriately.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="importtsv.also"><a class="anchor" href="#importtsv.also"></a>144.11.4. See Also</h4>
+<h4 id="importtsv.also"><a class="anchor" href="#importtsv.also"></a>144.12.4. See Also</h4>
 <div class="paragraph">
 <p>For more information about bulk-loading HFiles into HBase, see <a href="#arch.bulk.load">arch.bulk.load</a></p>
 </div>
 </div>
 </div>
 <div class="sect2">
-<h3 id="completebulkload"><a class="anchor" href="#completebulkload"></a>144.12. CompleteBulkLoad</h3>
+<h3 id="completebulkload"><a class="anchor" href="#completebulkload"></a>144.13. CompleteBulkLoad</h3>
 <div class="paragraph">
 <p>The <code>completebulkload</code> utility will move generated StoreFiles into an HBase table.
 This utility is often used in conjunction with output from <a href="#importtsv">importtsv</a>.</p>
@@ -26439,7 +26472,7 @@ This utility is often used in conjunction with output from <a href="#importtsv">
 </div>
 </div>
 <div class="sect3">
-<h4 id="completebulkload.warning"><a class="anchor" href="#completebulkload.warning"></a>144.12.1. CompleteBulkLoad Warning</h4>
+<h4 id="completebulkload.warning"><a class="anchor" href="#completebulkload.warning"></a>144.13.1. CompleteBulkLoad Warning</h4>
 <div class="paragraph">
 <p>Data generated via MapReduce is often created with file permissions that are not compatible with the running HBase process.
 Assuming you&#8217;re running HDFS with permissions enabled, those permissions will need to be updated before you run CompleteBulkLoad.</p>
@@ -26450,7 +26483,7 @@ Assuming you&#8217;re running HDFS with permissions enabled, those permissions w
 </div>
 </div>
 <div class="sect2">
-<h3 id="_walplayer"><a class="anchor" href="#_walplayer"></a>144.13. WALPlayer</h3>
+<h3 id="_walplayer"><a class="anchor" href="#_walplayer"></a>144.14. WALPlayer</h3>
 <div class="paragraph">
 <p>WALPlayer is a utility to replay WAL files into HBase.</p>
 </div>
@@ -26483,7 +26516,7 @@ To NOT run WALPlayer as a mapreduce job on your cluster, force it to run all in
 </div>
 </div>
 <div class="sect2">
-<h3 id="rowcounter"><a class="anchor" href="#rowcounter"></a>144.14. RowCounter and CellCounter</h3>
+<h3 id="rowcounter"><a class="anchor" href="#rowcounter"></a>144.15. RowCounter and CellCounter</h3>
 <div class="paragraph">
 <p><a href="https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html">RowCounter</a>        is a mapreduce job to count all the rows of a table.
 This is a good utility to use as a sanity check to ensure that HBase can read all the blocks of a table if there are any concerns of metadata inconsistency.
@@ -26546,7 +26579,7 @@ Specify a time range to scan the table by using the <code>--starttime=[starttime
 </div>
 </div>
 <div class="sect2">
-<h3 id="_mlockall"><a class="anchor" href="#_mlockall"></a>144.15. mlockall</h3>
+<h3 id="_mlockall"><a class="anchor" href="#_mlockall"></a>144.16. mlockall</h3>
 <div class="paragraph">
 <p>It is possible to optionally pin your servers in physical memory making them less likely to be swapped out in oversubscribed environments by having the servers call <a href="http://linux.die.net/man/2/mlockall">mlockall</a> on startup.
 See <a href="https://issues.apache.org/jira/browse/HBASE-4391">HBASE-4391 Add ability to
@@ -26554,7 +26587,7 @@ See <a href="https://issues.apache.org/jira/browse/HBASE-4391">HBASE-4391 Add ab
 </div>
 </div>
 <div class="sect2">
-<h3 id="compaction.tool"><a class="anchor" href="#compaction.tool"></a>144.16. Offline Compaction Tool</h3>
+<h3 id="compaction.tool"><a class="anchor" href="#compaction.tool"></a>144.17. Offline Compaction Tool</h3>
 <div class="paragraph">
 <p>See the usage for the
 <a href="https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/regionserver/CompactionTool.html">CompactionTool</a>.
@@ -26567,7 +26600,7 @@ Run it like:</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="__code_hbase_clean_code"><a class="anchor" href="#__code_hbase_clean_code"></a>144.17. <code>hbase clean</code></h3>
+<h3 id="__code_hbase_clean_code"><a class="anchor" href="#__code_hbase_clean_code"></a>144.18. <code>hbase clean</code></h3>
 <div class="paragraph">
 <p>The <code>hbase clean</code> command cleans HBase data from ZooKeeper, HDFS, or both.
 It is appropriate to use for testing.
@@ -26586,7 +26619,7 @@ Options:
 </div>
 </div>
 <div class="sect2">
-<h3 id="__code_hbase_pe_code"><a class="anchor" href="#__code_hbase_pe_code"></a>144.18. <code>hbase pe</code></h3>
+<h3 id="__code_hbase_pe_code"><a class="anchor" href="#__code_hbase_pe_code"></a>144.19. <code>hbase pe</code></h3>
 <div class="paragraph">
 <p>The <code>hbase pe</code> command runs the PerformanceEvaluation tool, which is used for testing.</p>
 </div>
@@ -26599,12 +26632,12 @@ For usage instructions, run the command with no options.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="__code_hbase_ltt_code"><a class="anchor" href="#__code_hbase_ltt_code"></a>144.19. <code>hbase ltt</code></h3>
+<h3 id="__code_hbase_ltt_code"><a class="anchor" href="#__code_hbase_ltt_code"></a>144.20. <code>hbase ltt</code></h3>
 <div class="paragraph">
 <p>The <code>hbase ltt</code> command runs the LoadTestTool utility, which is used for testing.</p>
 </div>
 <div class="paragraph">
-<p>You must specify one of <code>-write</code>, <code>-update</code>, or <code>-read</code> as the first option.
+<p>You must specify either <code>-init_only</code> or at least one of <code>-write</code>, <code>-update</code>, or <code>-read</code>.
 For general usage instructions, pass the <code>-h</code> option.</p>
 </div>
 <div class="paragraph">
@@ -37078,7 +37111,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-03-30 14:29:50 UTC
+Last updated 2018-03-31 14:29:54 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index a4aabc1..53781c6 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -296,7 +296,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index dcc645d..671bf2c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -111545,145 +111545,145 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
-<td>858</td></tr>
+<td>857</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>859</td></tr>
+<td>858</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>860</td></tr>
+<td>859</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>865</td></tr>
+<td>864</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>945</td></tr>
+<td>944</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>950</td></tr>
+<td>949</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>999</td></tr>
+<td>998</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>1033</td></tr>
+<td>1032</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>1034</td></tr>
+<td>1033</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>1035</td></tr>
+<td>1034</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>1061</td></tr>
+<td>1060</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>1081</td></tr>
+<td>1080</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>1090</td></tr>
+<td>1089</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>1092</td></tr>
+<td>1091</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>1094</td></tr>
+<td>1093</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>1102</td></tr>
+<td>1101</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>1153</td></tr>
+<td>1152</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>1161</td></tr>
+<td>1160</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>1162</td></tr>
+<td>1161</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>1228</td></tr>
+<td>1227</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>1231</td></tr>
+<td>1230</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>1275</td></tr>
+<td>1274</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>1399</td></tr>
+<td>1398</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>1417</td></tr></table></div>
+<td>1416</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">
@@ -112409,7 +112409,7 @@
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>268</td></tr></table></div>
+<td>278</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.AbstractPositionedByteRange.java">org/apache/hadoop/hbase/util/AbstractPositionedByteRange.java</h3>
 <table border="0" class="table table-striped">
@@ -117035,31 +117035,31 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>321</td></tr>
+<td>328</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 191 lines (max allowed is 150).</td>
-<td>548</td></tr>
+<td>575</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>621</td></tr>
+<td>648</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 35 has parse error. Missed HTML close tag 'index'. Sometimes it means that close tag missed for one of previous tags.</td>
-<td>796</td></tr>
+<td>823</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>865</td></tr></table></div>
+<td>892</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.util.MD5Hash.java">org/apache/hadoop/hbase/util/MD5Hash.java</h3>
 <table border="0" class="table table-striped">
@@ -123711,7 +123711,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 2cb1b37..d842510 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -365,7 +365,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 9ff2616..7bdec3c 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -430,7 +430,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 467b960..fbfb817 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1095,7 +1095,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 059a3ed..3587f06 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -303,7 +303,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 4e34e8b..c016d1a 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -959,7 +959,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 996c64c..832980c 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,21 +3768,21 @@
 <!--   -->
 </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>"Fri Mar 30 14:41:02 UTC 2018"</code></td>
+<td class="colLast"><code>"Sat Mar 31 14:41:18 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="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#revision">revision</a></code></td>
-<td class="colLast"><code>"e60f34fdb5ea7039e5f1eb69252927605ad1612a"</code></td>
+<td class="colLast"><code>"c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="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>"a4c3943fadc93753532fce12f61c9de6"</code></td>
+<td class="colLast"><code>"952cd074f3c741c573ff0d57a237f941"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 038aa78..4fa81d8 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -75584,6 +75584,10 @@
 <dd>
 <div class="block">Constructs a new pair, inferring the type via the passed arguments</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></dt>
+<dd>
+<div class="block">Create the parser to use for parsing and validating the command line.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#newProcedure-java.lang.String-">newProcedure(String)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.html#newRate-java.lang.String-">newRate(String)</a></span> - Method in class org.apache.hadoop.metrics2.lib.<a href="org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.html" title="class in org.apache.hadoop.metrics2.lib">DynamicMetricsRegistry</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/backup/BackupDriver.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/BackupDriver.html b/devapidocs/org/apache/hadoop/hbase/backup/BackupDriver.html
index 594f068..ffa80c3 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/BackupDriver.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/BackupDriver.html
@@ -232,7 +232,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.h
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.co
 nf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, 
 <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/backup/RestoreDriver.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/RestoreDriver.html b/devapidocs/org/apache/hadoop/hbase/backup/RestoreDriver.html
index 7ea8466..ef1082d 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/RestoreDriver.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/RestoreDriver.html
@@ -248,7 +248,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.h
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.co
 nf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, 
 <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupCopyJob.SnapshotCopy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupCopyJob.SnapshotCopy.html b/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupCopyJob.SnapshotCopy.html
index 4e1e72a..b55d4af 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupCopyJob.SnapshotCopy.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupCopyJob.SnapshotCopy.html
@@ -238,7 +238,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/snapshot/ExportSnapsh
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../../or
 g/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../../org/apache/
 hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</a>, <a href="../../../../../../org/apache/hadoo
 p/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../../or
 g/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../../org/apache/
 hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../../org/apache/hadoop/hbas
 e/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</a>, <a href="../../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 01efc59..90d9b0f 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,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.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/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.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 184167f..5f05328 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -550,24 +550,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/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/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/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/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/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/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index ce950b0..ae0124e 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,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.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 13095d8..6cabf7c 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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.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/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/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/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/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/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/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 0284fd4..9291562 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.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/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>
-<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/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/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.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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 1f90dde..7600159 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -349,8 +349,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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
+<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 a07a1d8..99a6541 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -294,9 +294,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.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>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/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>
 </ul>
 </li>
 </ul>

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


[20/25] hbase-site git commit: Published site at c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        admin.enableTable(wri

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLin

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index b0109d6..ff9eaf8 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -26441,6 +26441,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/MapreduceTestingShim.html#newJobContext-org.apache.hadoop.conf.Configuration-">newJobContext(Configuration)</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/MapreduceTestingShim.html" title="class in org.apache.hadoop.hbase.tool">MapreduceTestingShim</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/LoadTestTool.html#newParser--">newParser()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/LoadTestTool.html" title="class in org.apache.hadoop.hbase.util">LoadTestTool</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.ProcedureFactory.html#newProcedure-long-">newProcedure(long)</a></span> - Method in interface org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.ProcedureFactory.html" title="interface in org.apache.hadoop.hbase.master.procedure">MasterProcedureSchedulerPerformanceEvaluation.ProcedureFactory</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.RegionProcedureFactory.html#newProcedure-long-">newProcedure(long)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.RegionProcedureFactory.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureSchedulerPerformanceEvaluation.RegionProcedureFactory</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/AcidGuaranteesTestTool.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/AcidGuaranteesTestTool.html b/testdevapidocs/org/apache/hadoop/hbase/AcidGuaranteesTestTool.html
index ac3c29c..6368cf0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/AcidGuaranteesTestTool.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/AcidGuaranteesTestTool.html
@@ -312,7 +312,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestAcidGuarantees.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestAcidGuarantees.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestAcidGuarantees.html
index f3bd303..22cd847 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestAcidGuarantees.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestAcidGuarantees.html
@@ -264,7 +264,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestBase.html" t
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBackupRestore.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBackupRestore.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBackupRestore.html
index 7e9c252..d7ed881 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBackupRestore.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBackupRestore.html
@@ -433,7 +433,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestBase.html" t
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBase.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBase.html
index 3dd2ae1..ca6ed95 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestBase.html
@@ -320,7 +320,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html
index 57c04cf..f31be38 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.html
@@ -471,7 +471,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestBase.html" t
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngest.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngest.html
index ad366db..a49ced2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngest.html
@@ -348,7 +348,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestBase.html" t
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestStripeCompactions.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestStripeCompactions.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestStripeCompactions.html
index 29047a0..38291b0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestStripeCompactions.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestStripeCompactions.html
@@ -224,7 +224,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithACL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithACL.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithACL.html
index 8b4d589..5822047 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithACL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithACL.html
@@ -286,7 +286,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.html
index a67d630..557b290 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.html
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html
index 41fae44..eb5251c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html
@@ -293,7 +293,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithTags.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithTags.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithTags.html
index 5048ff4..5b8c104 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithTags.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithTags.html
@@ -252,7 +252,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.html
index 76f837e..8a6c801 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.html
@@ -260,7 +260,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.html
index cecea2c..04b132f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.html
@@ -360,7 +360,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestBase.html" t
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaReplication.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaReplication.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaReplication.html
index 2b19b7b..4e118bc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaReplication.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestRegionReplicaReplication.html
@@ -321,7 +321,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/IntegrationTestIngest.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestsDriver.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestsDriver.html b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestsDriver.html
index fe932c5..2d811dc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestsDriver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/IntegrationTestsDriver.html
@@ -244,7 +244,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/ScanPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ScanPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/ScanPerformanceEvaluation.html
index a1de63f..830d933 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ScanPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ScanPerformanceEvaluation.html
@@ -281,7 +281,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html
index 4488bb0..a47a98f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html
@@ -362,7 +362,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html b/testdevapidocs/org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html
index 653519a..e6c6f1e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html
@@ -283,7 +283,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.html b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.html
index 81a9330..913897f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.html
@@ -460,7 +460,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/IntegrationTestBase.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.html b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.html
index 165e6b4..d5f97c1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.html
@@ -325,7 +325,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/IntegrationTestBase.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.html
index 5f1bb00..f3d8919 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.html
@@ -287,7 +287,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html
index fd71c50..de523c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html
@@ -342,7 +342,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 4ca0d97..12f229d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -568,15 +568,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 19002f2..b72e392 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -206,8 +206,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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html
index 1e35f3b..3a1f413 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html
@@ -310,7 +310,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html
index 1c2276e..f2b6c08 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html
@@ -328,7 +328,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 5a0f2bd..8ada05d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -655,11 +655,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html
index 910b304..0aa7eed 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html
@@ -507,7 +507,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/IntegrationTestBase.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html
index 023de19..ad0bb2a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html
@@ -411,7 +411,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigL
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html
index 561bdf9..7a10230 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html
@@ -423,7 +423,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/IntegrationTestBase.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestMonkeys.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestMonkeys.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestMonkeys.html
index d4350c5..17b1096 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestMonkeys.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestMonkeys.html
@@ -224,7 +224,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRu
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestReplication.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestReplication.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestReplication.html
index fe1dd1c..917327b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestReplication.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestReplication.html
@@ -401,7 +401,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigL
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.html
index e811d11..4c1a91b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.html
@@ -270,7 +270,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestTime
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.html
index 03b5388..5b03e5d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.html
@@ -346,7 +346,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/IntegrationTestIngest.ht
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.html
index f42abe7..5429c54 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.html
@@ -441,7 +441,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoad
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestZKAndFSPermissions.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestZKAndFSPermissions.html b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestZKAndFSPermissions.html
index 03d194b..4c028ff 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestZKAndFSPermissions.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/IntegrationTestZKAndFSPermissions.html
@@ -291,7 +291,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index bae8c22..1a628fe 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html b/testdevapidocs/org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html
index 27fc768..26bb661 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html
@@ -273,7 +273,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, processOldArgs, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/util/AbstractHBaseToolTest.TestTool.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/util/AbstractHBaseToolTest.TestTool.html b/testdevapidocs/org/apache/hadoop/hbase/util/AbstractHBaseToolTest.TestTool.html
index 6689fc2..7803925 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/util/AbstractHBaseToolTest.TestTool.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/util/AbstractHBaseToolTest.TestTool.html
@@ -221,7 +221,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.AbstractHBaseTool</h3>
-<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, parseArgs, parseInt, parseLong, printUsage, printUsage, run, setConf</code></li>
+<code>addOption, addOptNoArg, addOptNoArg, addOptWithArg, addOptWithArg, addRequiredOption, addRequiredOptWithArg, addRequiredOptWithArg, doStaticMain, getConf, getOptionAsDouble, getOptionAsInt, getOptionAsLong, newParser, parseArgs, parseInt, parseLong, printUsage, printUsage, run, setConf</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html b/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
index c6ef794..1fb7edd 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.873">LoadTestTool.WorkerThread</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.900">LoadTestTool.WorkerThread</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>workerArgs</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/util/LoadTestTool.WorkerThread.html#line.874">workerArgs</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/util/LoadTestTool.WorkerThread.html#line.901">workerArgs</a></pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WorkerThread</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html#line.876">WorkerThread</a>(int&nbsp;i,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html#line.903">WorkerThread</a>(int&nbsp;i,
              <a href="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>
@@ -275,7 +275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html#line.882">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html#line.909">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>


[21/25] hbase-site git commit: Published site at c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 91090d9..c7e9715 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.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.1349">Canary.RegionServerMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1348">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>
 </li>
 </ul>
@@ -255,7 +255,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.1351">allRegions</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1350">allRegions</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <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.1353">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.1352">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,
@@ -295,7 +295,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.1360">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.1359">getSink</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -304,7 +304,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.1368">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1367">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>
@@ -319,7 +319,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.1384">checkNoTableNames</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1383">checkNoTableNames</a>()</pre>
 </li>
 </ul>
 <a name="monitorRegionServers-java.util.Map-org.apache.hadoop.hbase.tool.Canary.RegionServerStdOutSink-">
@@ -328,7 +328,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.1417">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.1416">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>
@@ -338,7 +338,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.1467">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.1466">filterRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="getAllRegionServerByName--">
@@ -347,7 +347,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.1473">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.1472">getAllRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="doFilterRegionServerByName-java.util.Map-">
@@ -356,7 +356,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.1528">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.1527">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/839437ee/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 a32525e..df0c619 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.1287">Canary.ZookeeperMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1286">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>
@@ -243,7 +243,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.1288">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.1287">hosts</a></pre>
 </li>
 </ul>
 <a name="znode">
@@ -252,7 +252,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.1289">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.1288">znode</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -261,7 +261,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.1290">timeout</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1289">timeout</a></pre>
 </li>
 </ul>
 </li>
@@ -278,7 +278,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <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.1292">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.1291">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,
@@ -300,7 +300,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.1309">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1308">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>
@@ -315,7 +315,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.1339">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.1338">getSink</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 27effc3..40d2e0c 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
@@ -828,7 +828,7 @@ 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.879">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.878">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>.
@@ -848,7 +848,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.1230">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.1229">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,
@@ -869,7 +869,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.1248">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.1247">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="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,
@@ -889,7 +889,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.1567">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.1566">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/839437ee/devapidocs/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/AbstractHBaseTool.html b/devapidocs/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
index e4e8616..c508999 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/AbstractHBaseTool.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":6,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":6,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":9,"i18":9,"i19":10,"i20":10,"i21":10,"i22":6,"i23":10,"i24":10};
+var methods = {"i0":10,"i1":6,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":6,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":9,"i19":9,"i20":10,"i21":10,"i22":10,"i23":6,"i24":10,"i25":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -323,16 +323,22 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#isHelpCommand-java.lang.String:A-">isHelpCommand</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="i16" class="altColor">
+<td class="colFirst"><code>protected org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a></span>()</code>
+<div class="block">Create the parser to use for parsing and validating the command line.</div>
+</td>
+</tr>
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>protected org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.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="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</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;s,
         int&nbsp;minValue,
         int&nbsp;maxValue)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</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;s,
          long&nbsp;minValue,
@@ -340,33 +346,33 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <div class="block">Parse a number and enforce a range.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</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;usageStr,
           <a href="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;usageHeader,
           <a href="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;usageFooter)</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="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;args)</code>
 <div class="block">For backward compatibility.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>protected abstract void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOptions-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-">processOptions</a></span>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</code>
 <div class="block">This method is called to process the options after they have been parsed.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.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="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
@@ -628,13 +634,29 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 </dl>
 </li>
 </ul>
+<a name="newParser--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>newParser</h4>
+<pre>protected&nbsp;org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.169">newParser</a>()</pre>
+<div class="block">Create the parser to use for parsing and validating the command line. Since commons-cli lacks
+ the capability to validate arbitrary combination of options, it may be helpful to bake custom
+ logic into a specialized parser implementation. See LoadTestTool for examples.</div>
+<dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>a new parser specific to the current tool</dd>
+</dl>
+</li>
+</ul>
 <a name="isHelpCommand-java.lang.String:A-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>isHelpCommand</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.163">isHelpCommand</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;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.173">isHelpCommand</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 org.apache.hbase.thirdparty.org.apache.commons.cli.ParseException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -648,7 +670,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>parseArgs</h4>
-<pre>protected&nbsp;org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.170">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>protected&nbsp;org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.180">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)
                                                                             throws org.apache.hbase.thirdparty.org.apache.commons.cli.ParseException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -662,7 +684,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.177">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.187">printUsage</a>()</pre>
 </li>
 </ul>
 <a name="printUsage-java.lang.String-java.lang.String-java.lang.String-">
@@ -671,7 +693,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.181">printUsage</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;usageStr,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.191">printUsage</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;usageStr,
                           <a href="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;usageHeader,
                           <a href="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;usageFooter)</pre>
 </li>
@@ -682,7 +704,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addOption</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.189">addOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option&nbsp;option)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.199">addOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option&nbsp;option)</pre>
 </li>
 </ul>
 <a name="addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">
@@ -691,7 +713,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addRequiredOption</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.194">addRequiredOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option&nbsp;option)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.204">addRequiredOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option&nbsp;option)</pre>
 </li>
 </ul>
 <a name="addRequiredOptWithArg-java.lang.String-java.lang.String-">
@@ -700,7 +722,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addRequiredOptWithArg</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.199">addRequiredOptWithArg</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;opt,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.209">addRequiredOptWithArg</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;opt,
                                      <a href="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;description)</pre>
 </li>
 </ul>
@@ -710,7 +732,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addRequiredOptWithArg</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.205">addRequiredOptWithArg</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;shortOpt,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.215">addRequiredOptWithArg</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;shortOpt,
                                      <a href="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;longOpt,
                                      <a href="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;description)</pre>
 </li>
@@ -721,7 +743,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addOptNoArg</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.211">addOptNoArg</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;opt,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.221">addOptNoArg</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;opt,
                            <a href="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;description)</pre>
 </li>
 </ul>
@@ -731,7 +753,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addOptNoArg</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.215">addOptNoArg</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;shortOpt,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.225">addOptNoArg</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;shortOpt,
                            <a href="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;longOpt,
                            <a href="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;description)</pre>
 </li>
@@ -742,7 +764,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addOptWithArg</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.219">addOptWithArg</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;opt,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.229">addOptWithArg</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;opt,
                              <a href="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;description)</pre>
 </li>
 </ul>
@@ -752,7 +774,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>addOptWithArg</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.223">addOptWithArg</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;shortOpt,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.233">addOptWithArg</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;shortOpt,
                              <a href="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;longOpt,
                              <a href="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;description)</pre>
 </li>
@@ -763,7 +785,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>getOptionAsInt</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.227">getOptionAsInt</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.237">getOptionAsInt</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd,
                           <a href="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;opt,
                           int&nbsp;defaultValue)</pre>
 </li>
@@ -774,7 +796,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>getOptionAsLong</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.235">getOptionAsLong</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.245">getOptionAsLong</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd,
                             <a href="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;opt,
                             int&nbsp;defaultValue)</pre>
 </li>
@@ -785,7 +807,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>getOptionAsDouble</h4>
-<pre>public&nbsp;double&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.243">getOptionAsDouble</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd,
+<pre>public&nbsp;double&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.253">getOptionAsDouble</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd,
                                 <a href="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;opt,
                                 double&nbsp;defaultValue)</pre>
 </li>
@@ -796,7 +818,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>parseLong</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.254">parseLong</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;s,
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.264">parseLong</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;s,
                              long&nbsp;minValue,
                              long&nbsp;maxValue)</pre>
 <div class="block">Parse a number and enforce a range.</div>
@@ -808,7 +830,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockList">
 <li class="blockList">
 <h4>parseInt</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.263">parseInt</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;s,
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.273">parseInt</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;s,
                            int&nbsp;minValue,
                            int&nbsp;maxValue)</pre>
 </li>
@@ -819,7 +841,7 @@ implements org.apache.hadoop.util.Tool, org.apache.hadoop.conf.Configurable</pre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doStaticMain</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.268">doStaticMain</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>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.278">doStaticMain</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>
 <div class="block">Call this from the concrete tool class's main function.</div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/devapidocs/org/apache/hadoop/hbase/util/RegionMover.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/RegionMover.html b/devapidocs/org/apache/hadoop/hbase/util/RegionMover.html
index 01cf4db..ae11269 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/RegionMover.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/RegionMover.html
@@ -442,7 +442,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.h
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run
 </a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addOption</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptNoArg-java.lang.String-java.lang.String-java.lang.String-">addOptNoArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOption-org.apache.hbase.thirdparty.org.apache.commons.cli.Option-">addRequiredOption</a>, <a href="../../../../../org/apache/hadoop/hbase
 /util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addRequiredOptWithArg-java.lang.String-java.lang.String-java.lang.String-">addRequiredOptWithArg</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#doStaticMain-java.lang.String:A-">doStaticMain</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getConf--">getConf</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsDouble-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-double-">getOptionAsDouble</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#getOptionAsInt-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.htm
 l#getOptionAsLong-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-java.lang.String-int-">getOptionAsLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#newParser--">newParser</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseArgs-java.lang.String:A-">parseArgs</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseInt-java.lang.String-int-int-">parseInt</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#parseLong-java.lang.String-long-long-">parseLong</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage-java.lang.String-java.lang.String-java.lang.String-">printUsage</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#processOldArgs-java.util.List-">processOldArgs</a>, 
 <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#run-java.lang.String:A-">run</a>, <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 714009e..971f463 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -532,14 +532,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/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/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/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/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/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/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/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 014e5f3..d2520a1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "e60f34fdb5ea7039e5f1eb69252927605ad1612a";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "c8dff328cb39e5a3a5a42c6b73fca7af707a0bcb";<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 = "Fri Mar 30 14:41:02 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Mar 31 14:41:18 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 = "a4c3943fadc93753532fce12f61c9de6";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "952cd074f3c741c573ff0d57a237f941";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.html b/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.html
index 4039618..32b26a9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/util/LoadTestTool.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":9,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":9,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Tools")
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.69">LoadTestTool</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.76">LoadTestTool</a>
 extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <div class="block">A command-line utility that reads, writes, and verifies data. Unlike
  <a href="../../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase"><code>PerformanceEvaluation</code></a>, this tool validates the data written,
@@ -675,27 +675,31 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/LoadTestTool.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="i14" class="altColor">
+<td class="colFirst"><code>protected org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/LoadTestTool.html#newParser--">newParser</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/LoadTestTool.html#parallelLoadTables--">parallelLoadTables</a></span>()</code>
 <div class="block">When NUM_TABLES is specified, the function starts multiple worker threads
  which individually start a LoadTestTool instance to load a table.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/LoadTestTool.html#parseColumnFamilyOptions-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-">parseColumnFamilyOptions</a></span>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/LoadTestTool.html#processOptions-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-">processOptions</a></span>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" 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/util/LoadTestTool.html#splitColonSeparated-java.lang.String-int-int-">splitColonSeparated</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;option,
                    int&nbsp;minNumCols,
                    int&nbsp;maxNumCols)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/LoadTestTool.html#workerThreadError-java.lang.Throwable-">workerThreadError</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</code>&nbsp;</td>
 </tr>
@@ -734,7 +738,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</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/util/LoadTestTool.html#line.71">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.78">LOG</a></pre>
 </li>
 </ul>
 <a name="COLON">
@@ -743,7 +747,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>COLON</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/util/LoadTestTool.html#line.72">COLON</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/util/LoadTestTool.html#line.79">COLON</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.COLON">Constant Field Values</a></dd>
@@ -756,7 +760,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.75">tableName</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.82">tableName</a></pre>
 <div class="block">Table name for the test</div>
 </li>
 </ul>
@@ -766,7 +770,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>families</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.78">families</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.85">families</a></pre>
 <div class="block">Column families for the test</div>
 </li>
 </ul>
@@ -776,7 +780,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_TABLE_NAME</h4>
-<pre>protected 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/util/LoadTestTool.html#line.81">DEFAULT_TABLE_NAME</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.88">DEFAULT_TABLE_NAME</a></pre>
 <div class="block">Table name to use of not overridden on the command line</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -790,7 +794,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_DATA_SIZE</h4>
-<pre>protected static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.84">DEFAULT_DATA_SIZE</a></pre>
+<pre>protected static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.91">DEFAULT_DATA_SIZE</a></pre>
 <div class="block">The default data size if not specified</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -804,7 +808,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_NUM_THREADS</h4>
-<pre>protected static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.87">DEFAULT_NUM_THREADS</a></pre>
+<pre>protected static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.94">DEFAULT_NUM_THREADS</a></pre>
 <div class="block">The number of reader/writer threads if not specified</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -818,7 +822,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_USAGE_LOAD</h4>
-<pre>protected 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/util/LoadTestTool.html#line.90">OPT_USAGE_LOAD</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.97">OPT_USAGE_LOAD</a></pre>
 <div class="block">Usage string for the load option</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -832,7 +836,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_USAGE_READ</h4>
-<pre>protected 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/util/LoadTestTool.html#line.95">OPT_USAGE_READ</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.102">OPT_USAGE_READ</a></pre>
 <div class="block">Usage string for the read option</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -846,7 +850,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_USAGE_UPDATE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.99">OPT_USAGE_UPDATE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.106">OPT_USAGE_UPDATE</a></pre>
 <div class="block">Usage string for the update option</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -860,7 +864,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_USAGE_BLOOM</h4>
-<pre>protected 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/util/LoadTestTool.html#line.103">OPT_USAGE_BLOOM</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.110">OPT_USAGE_BLOOM</a></pre>
 </li>
 </ul>
 <a name="OPT_USAGE_COMPRESSION">
@@ -869,7 +873,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_USAGE_COMPRESSION</h4>
-<pre>protected 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/util/LoadTestTool.html#line.106">OPT_USAGE_COMPRESSION</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.113">OPT_USAGE_COMPRESSION</a></pre>
 </li>
 </ul>
 <a name="OPT_BLOOM">
@@ -878,7 +882,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_BLOOM</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/util/LoadTestTool.html#line.109">OPT_BLOOM</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/util/LoadTestTool.html#line.116">OPT_BLOOM</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_BLOOM">Constant Field Values</a></dd>
@@ -891,7 +895,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_COMPRESSION</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/util/LoadTestTool.html#line.110">OPT_COMPRESSION</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/util/LoadTestTool.html#line.117">OPT_COMPRESSION</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_COMPRESSION">Constant Field Values</a></dd>
@@ -904,7 +908,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_DEFERRED_LOG_FLUSH</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/util/LoadTestTool.html#line.111">OPT_DEFERRED_LOG_FLUSH</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/util/LoadTestTool.html#line.118">OPT_DEFERRED_LOG_FLUSH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_DEFERRED_LOG_FLUSH">Constant Field Values</a></dd>
@@ -917,7 +921,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_DEFERRED_LOG_FLUSH_USAGE</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/util/LoadTestTool.html#line.112">OPT_DEFERRED_LOG_FLUSH_USAGE</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/util/LoadTestTool.html#line.119">OPT_DEFERRED_LOG_FLUSH_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_DEFERRED_LOG_FLUSH_USAGE">Constant Field Values</a></dd>
@@ -930,7 +934,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_INMEMORY</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/util/LoadTestTool.html#line.114">OPT_INMEMORY</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/util/LoadTestTool.html#line.121">OPT_INMEMORY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_INMEMORY">Constant Field Values</a></dd>
@@ -943,7 +947,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_USAGE_IN_MEMORY</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/util/LoadTestTool.html#line.115">OPT_USAGE_IN_MEMORY</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/util/LoadTestTool.html#line.122">OPT_USAGE_IN_MEMORY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_USAGE_IN_MEMORY">Constant Field Values</a></dd>
@@ -956,7 +960,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_GENERATOR</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/util/LoadTestTool.html#line.118">OPT_GENERATOR</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/util/LoadTestTool.html#line.125">OPT_GENERATOR</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_GENERATOR">Constant Field Values</a></dd>
@@ -969,7 +973,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_GENERATOR_USAGE</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/util/LoadTestTool.html#line.119">OPT_GENERATOR_USAGE</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/util/LoadTestTool.html#line.126">OPT_GENERATOR_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_GENERATOR_USAGE">Constant Field Values</a></dd>
@@ -982,7 +986,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_WRITER</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/util/LoadTestTool.html#line.122">OPT_WRITER</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/util/LoadTestTool.html#line.129">OPT_WRITER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_WRITER">Constant Field Values</a></dd>
@@ -995,7 +999,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_WRITER_USAGE</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/util/LoadTestTool.html#line.123">OPT_WRITER_USAGE</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/util/LoadTestTool.html#line.130">OPT_WRITER_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_WRITER_USAGE">Constant Field Values</a></dd>
@@ -1008,7 +1012,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_UPDATER</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/util/LoadTestTool.html#line.125">OPT_UPDATER</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/util/LoadTestTool.html#line.132">OPT_UPDATER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_UPDATER">Constant Field Values</a></dd>
@@ -1021,7 +1025,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_UPDATER_USAGE</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/util/LoadTestTool.html#line.126">OPT_UPDATER_USAGE</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/util/LoadTestTool.html#line.133">OPT_UPDATER_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_UPDATER_USAGE">Constant Field Values</a></dd>
@@ -1034,7 +1038,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_READER</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/util/LoadTestTool.html#line.128">OPT_READER</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/util/LoadTestTool.html#line.135">OPT_READER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_READER">Constant Field Values</a></dd>
@@ -1047,7 +1051,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_READER_USAGE</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/util/LoadTestTool.html#line.129">OPT_READER_USAGE</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/util/LoadTestTool.html#line.136">OPT_READER_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_READER_USAGE">Constant Field Values</a></dd>
@@ -1060,7 +1064,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_KEY_WINDOW</h4>
-<pre>protected 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/util/LoadTestTool.html#line.131">OPT_KEY_WINDOW</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.138">OPT_KEY_WINDOW</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_KEY_WINDOW">Constant Field Values</a></dd>
@@ -1073,7 +1077,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_WRITE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.132">OPT_WRITE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.139">OPT_WRITE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_WRITE">Constant Field Values</a></dd>
@@ -1086,7 +1090,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_MAX_READ_ERRORS</h4>
-<pre>protected 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/util/LoadTestTool.html#line.133">OPT_MAX_READ_ERRORS</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.140">OPT_MAX_READ_ERRORS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_MAX_READ_ERRORS">Constant Field Values</a></dd>
@@ -1099,7 +1103,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_MULTIPUT</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/util/LoadTestTool.html#line.134">OPT_MULTIPUT</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/util/LoadTestTool.html#line.141">OPT_MULTIPUT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_MULTIPUT">Constant Field Values</a></dd>
@@ -1112,7 +1116,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_MULTIGET</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/util/LoadTestTool.html#line.135">OPT_MULTIGET</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/util/LoadTestTool.html#line.142">OPT_MULTIGET</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_MULTIGET">Constant Field Values</a></dd>
@@ -1125,7 +1129,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_NUM_KEYS</h4>
-<pre>protected 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/util/LoadTestTool.html#line.136">OPT_NUM_KEYS</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.143">OPT_NUM_KEYS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_NUM_KEYS">Constant Field Values</a></dd>
@@ -1138,7 +1142,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_READ</h4>
-<pre>protected 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/util/LoadTestTool.html#line.137">OPT_READ</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.144">OPT_READ</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_READ">Constant Field Values</a></dd>
@@ -1151,7 +1155,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_START_KEY</h4>
-<pre>protected 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/util/LoadTestTool.html#line.138">OPT_START_KEY</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.145">OPT_START_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_START_KEY">Constant Field Values</a></dd>
@@ -1164,7 +1168,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_TABLE_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/util/LoadTestTool.html#line.139">OPT_TABLE_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/util/LoadTestTool.html#line.146">OPT_TABLE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_TABLE_NAME">Constant Field Values</a></dd>
@@ -1177,7 +1181,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_COLUMN_FAMILIES</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/util/LoadTestTool.html#line.140">OPT_COLUMN_FAMILIES</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/util/LoadTestTool.html#line.147">OPT_COLUMN_FAMILIES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_COLUMN_FAMILIES">Constant Field Values</a></dd>
@@ -1190,7 +1194,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_ZK_QUORUM</h4>
-<pre>protected 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/util/LoadTestTool.html#line.141">OPT_ZK_QUORUM</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.148">OPT_ZK_QUORUM</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_ZK_QUORUM">Constant Field Values</a></dd>
@@ -1203,7 +1207,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_ZK_PARENT_NODE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.142">OPT_ZK_PARENT_NODE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.149">OPT_ZK_PARENT_NODE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_ZK_PARENT_NODE">Constant Field Values</a></dd>
@@ -1216,7 +1220,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_SKIP_INIT</h4>
-<pre>protected 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/util/LoadTestTool.html#line.143">OPT_SKIP_INIT</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.150">OPT_SKIP_INIT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_SKIP_INIT">Constant Field Values</a></dd>
@@ -1229,7 +1233,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_INIT_ONLY</h4>
-<pre>protected 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/util/LoadTestTool.html#line.144">OPT_INIT_ONLY</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.151">OPT_INIT_ONLY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_INIT_ONLY">Constant Field Values</a></dd>
@@ -1242,7 +1246,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>NUM_TABLES</h4>
-<pre>protected 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/util/LoadTestTool.html#line.145">NUM_TABLES</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.152">NUM_TABLES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.NUM_TABLES">Constant Field Values</a></dd>
@@ -1255,7 +1259,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_BATCHUPDATE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.146">OPT_BATCHUPDATE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.153">OPT_BATCHUPDATE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_BATCHUPDATE">Constant Field Values</a></dd>
@@ -1268,7 +1272,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_UPDATE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.147">OPT_UPDATE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.154">OPT_UPDATE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_UPDATE">Constant Field Values</a></dd>
@@ -1281,7 +1285,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_ENCRYPTION</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/util/LoadTestTool.html#line.149">OPT_ENCRYPTION</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/util/LoadTestTool.html#line.156">OPT_ENCRYPTION</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_ENCRYPTION">Constant Field Values</a></dd>
@@ -1294,7 +1298,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_ENCRYPTION_USAGE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.150">OPT_ENCRYPTION_USAGE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.157">OPT_ENCRYPTION_USAGE</a></pre>
 </li>
 </ul>
 <a name="OPT_NUM_REGIONS_PER_SERVER">
@@ -1303,7 +1307,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_NUM_REGIONS_PER_SERVER</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/util/LoadTestTool.html#line.154">OPT_NUM_REGIONS_PER_SERVER</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/util/LoadTestTool.html#line.161">OPT_NUM_REGIONS_PER_SERVER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_NUM_REGIONS_PER_SERVER">Constant Field Values</a></dd>
@@ -1316,7 +1320,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_NUM_REGIONS_PER_SERVER_USAGE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.155">OPT_NUM_REGIONS_PER_SERVER_USAGE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.162">OPT_NUM_REGIONS_PER_SERVER_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_NUM_REGIONS_PER_SERVER_USAGE">Constant Field Values</a></dd>
@@ -1329,7 +1333,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_NUM_REGIONS_PER_SERVER</h4>
-<pre>public static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.157">DEFAULT_NUM_REGIONS_PER_SERVER</a></pre>
+<pre>public static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.164">DEFAULT_NUM_REGIONS_PER_SERVER</a></pre>
 </li>
 </ul>
 <a name="OPT_REGION_REPLICATION">
@@ -1338,7 +1342,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_REGION_REPLICATION</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/util/LoadTestTool.html#line.159">OPT_REGION_REPLICATION</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/util/LoadTestTool.html#line.166">OPT_REGION_REPLICATION</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_REGION_REPLICATION">Constant Field Values</a></dd>
@@ -1351,7 +1355,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_REGION_REPLICATION_USAGE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.160">OPT_REGION_REPLICATION_USAGE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.167">OPT_REGION_REPLICATION_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_REGION_REPLICATION_USAGE">Constant Field Values</a></dd>
@@ -1364,7 +1368,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_REGION_REPLICA_ID</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/util/LoadTestTool.html#line.163">OPT_REGION_REPLICA_ID</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/util/LoadTestTool.html#line.170">OPT_REGION_REPLICA_ID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_REGION_REPLICA_ID">Constant Field Values</a></dd>
@@ -1377,7 +1381,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_REGION_REPLICA_ID_USAGE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.164">OPT_REGION_REPLICA_ID_USAGE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.171">OPT_REGION_REPLICA_ID_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_REGION_REPLICA_ID_USAGE">Constant Field Values</a></dd>
@@ -1390,7 +1394,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_MOB_THRESHOLD</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/util/LoadTestTool.html#line.167">OPT_MOB_THRESHOLD</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/util/LoadTestTool.html#line.174">OPT_MOB_THRESHOLD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_MOB_THRESHOLD">Constant Field Values</a></dd>
@@ -1403,7 +1407,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>OPT_MOB_THRESHOLD_USAGE</h4>
-<pre>protected 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/util/LoadTestTool.html#line.168">OPT_MOB_THRESHOLD_USAGE</a></pre>
+<pre>protected 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/util/LoadTestTool.html#line.175">OPT_MOB_THRESHOLD_USAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.OPT_MOB_THRESHOLD_USAGE">Constant Field Values</a></dd>
@@ -1416,7 +1420,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_START_KEY</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.171">DEFAULT_START_KEY</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.178">DEFAULT_START_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.LoadTestTool.DEFAULT_START_KEY">Constant Field Values</a></dd>
@@ -1429,7 +1433,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>cmd</h4>
-<pre>protected&nbsp;org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.174">cmd</a></pre>
+<pre>protected&nbsp;org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.181">cmd</a></pre>
 <div class="block">This will be removed as we factor out the dependency on command line</div>
 </li>
 </ul>
@@ -1439,7 +1443,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writerThreads</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedWriter.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedWriter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.176">writerThreads</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedWriter.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedWriter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.183">writerThreads</a></pre>
 </li>
 </ul>
 <a name="readerThreads">
@@ -1448,7 +1452,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>readerThreads</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedReader.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedReader</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.177">readerThreads</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedReader.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedReader</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.184">readerThreads</a></pre>
 </li>
 </ul>
 <a name="updaterThreads">
@@ -1457,7 +1461,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>updaterThreads</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedUpdater.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedUpdater</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.178">updaterThreads</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedUpdater.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedUpdater</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.185">updaterThreads</a></pre>
 </li>
 </ul>
 <a name="startKey">
@@ -1466,7 +1470,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>startKey</h4>
-<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.180">startKey</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.187">startKey</a></pre>
 </li>
 </ul>
 <a name="endKey">
@@ -1475,7 +1479,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>endKey</h4>
-<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.180">endKey</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.187">endKey</a></pre>
 </li>
 </ul>
 <a name="isWrite">
@@ -1484,7 +1488,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isWrite</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.182">isWrite</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.189">isWrite</a></pre>
 </li>
 </ul>
 <a name="isRead">
@@ -1493,7 +1497,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isRead</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.182">isRead</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.189">isRead</a></pre>
 </li>
 </ul>
 <a name="isUpdate">
@@ -1502,7 +1506,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isUpdate</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.182">isUpdate</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.189">isUpdate</a></pre>
 </li>
 </ul>
 <a name="deferredLogFlush">
@@ -1511,7 +1515,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>deferredLogFlush</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.183">deferredLogFlush</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.190">deferredLogFlush</a></pre>
 </li>
 </ul>
 <a name="dataBlockEncodingAlgo">
@@ -1520,7 +1524,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>dataBlockEncodingAlgo</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.io.encoding.DataBlockEncoding <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.186">dataBlockEncodingAlgo</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.io.encoding.DataBlockEncoding <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.193">dataBlockEncodingAlgo</a></pre>
 </li>
 </ul>
 <a name="compressAlgo">
@@ -1529,7 +1533,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>compressAlgo</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.io.compress.Compression.Algorithm <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.187">compressAlgo</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.io.compress.Compression.Algorithm <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.194">compressAlgo</a></pre>
 </li>
 </ul>
 <a name="bloomType">
@@ -1538,7 +1542,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomType</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.188">bloomType</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.195">bloomType</a></pre>
 </li>
 </ul>
 <a name="inMemoryCF">
@@ -1547,7 +1551,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>inMemoryCF</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.189">inMemoryCF</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.196">inMemoryCF</a></pre>
 </li>
 </ul>
 <a name="userOwner">
@@ -1556,7 +1560,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>userOwner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.191">userOwner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.198">userOwner</a></pre>
 </li>
 </ul>
 <a name="numWriterThreads">
@@ -1565,7 +1569,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>numWriterThreads</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.193">numWriterThreads</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.200">numWriterThreads</a></pre>
 </li>
 </ul>
 <a name="minColsPerKey">
@@ -1574,7 +1578,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>minColsPerKey</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.194">minColsPerKey</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.201">minColsPerKey</a></pre>
 </li>
 </ul>
 <a name="maxColsPerKey">
@@ -1583,7 +1587,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>maxColsPerKey</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.194">maxColsPerKey</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.201">maxColsPerKey</a></pre>
 </li>
 </ul>
 <a name="minColDataSize">
@@ -1592,7 +1596,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>minColDataSize</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.195">minColDataSize</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.202">minColDataSize</a></pre>
 </li>
 </ul>
 <a name="maxColDataSize">
@@ -1601,7 +1605,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>maxColDataSize</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.195">maxColDataSize</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.202">maxColDataSize</a></pre>
 </li>
 </ul>
 <a name="isMultiPut">
@@ -1610,7 +1614,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isMultiPut</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.196">isMultiPut</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.203">isMultiPut</a></pre>
 </li>
 </ul>
 <a name="numUpdaterThreads">
@@ -1619,7 +1623,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>numUpdaterThreads</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.199">numUpdaterThreads</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.206">numUpdaterThreads</a></pre>
 </li>
 </ul>
 <a name="updatePercent">
@@ -1628,7 +1632,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>updatePercent</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.200">updatePercent</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.207">updatePercent</a></pre>
 </li>
 </ul>
 <a name="ignoreConflicts">
@@ -1637,7 +1641,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ignoreConflicts</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.201">ignoreConflicts</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.208">ignoreConflicts</a></pre>
 </li>
 </ul>
 <a name="isBatchUpdate">
@@ -1646,7 +1650,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isBatchUpdate</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.202">isBatchUpdate</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.209">isBatchUpdate</a></pre>
 </li>
 </ul>
 <a name="numReaderThreads">
@@ -1655,7 +1659,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>numReaderThreads</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.205">numReaderThreads</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.212">numReaderThreads</a></pre>
 </li>
 </ul>
 <a name="keyWindow">
@@ -1664,7 +1668,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>keyWindow</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.206">keyWindow</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.213">keyWindow</a></pre>
 </li>
 </ul>
 <a name="multiGetBatchSize">
@@ -1673,7 +1677,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>multiGetBatchSize</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.207">multiGetBatchSize</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.214">multiGetBatchSize</a></pre>
 </li>
 </ul>
 <a name="maxReadErrors">
@@ -1682,7 +1686,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>maxReadErrors</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.208">maxReadErrors</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.215">maxReadErrors</a></pre>
 </li>
 </ul>
 <a name="verifyPercent">
@@ -1691,7 +1695,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyPercent</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.209">verifyPercent</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.216">verifyPercent</a></pre>
 </li>
 </ul>
 <a name="numTables">
@@ -1700,7 +1704,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>numTables</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.211">numTables</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.218">numTables</a></pre>
 </li>
 </ul>
 <a name="superUser">
@@ -1709,7 +1713,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>superUser</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/util/LoadTestTool.html#line.213">superUser</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/util/LoadTestTool.html#line.220">superUser</a></pre>
 </li>
 </ul>
 <a name="userNames">
@@ -1718,7 +1722,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>userNames</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/util/LoadTestTool.html#line.215">userNames</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/util/LoadTestTool.html#line.222">userNames</a></pre>
 </li>
 </ul>
 <a name="authnFileName">
@@ -1727,7 +1731,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>authnFileName</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/util/LoadTestTool.html#line.217">authnFileName</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/util/LoadTestTool.html#line.224">authnFileName</a></pre>
 </li>
 </ul>
 <a name="numRegionsPerServer">
@@ -1736,7 +1740,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>numRegionsPerServer</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.219">numRegionsPerServer</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.226">numRegionsPerServer</a></pre>
 </li>
 </ul>
 <a name="regionReplication">
@@ -1745,7 +1749,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionReplication</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.220">regionReplication</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.227">regionReplication</a></pre>
 </li>
 </ul>
 <a name="regionReplicaId">
@@ -1754,7 +1758,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionReplicaId</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.221">regionReplicaId</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.228">regionReplicaId</a></pre>
 </li>
 </ul>
 <a name="mobThreshold">
@@ -1763,7 +1767,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>mobThreshold</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.223">mobThreshold</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.230">mobThreshold</a></pre>
 </li>
 </ul>
 <a name="isSkipInit">
@@ -1772,7 +1776,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isSkipInit</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.227">isSkipInit</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.234">isSkipInit</a></pre>
 </li>
 </ul>
 <a name="isInitOnly">
@@ -1781,7 +1785,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isInitOnly</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.228">isInitOnly</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.235">isInitOnly</a></pre>
 </li>
 </ul>
 <a name="cipher">
@@ -1790,7 +1794,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>cipher</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.io.crypto.Cipher <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.230">cipher</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.io.crypto.Cipher <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.237">cipher</a></pre>
 </li>
 </ul>
 <a name="thrown">
@@ -1799,7 +1803,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>thrown</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.854">thrown</a></pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.881">thrown</a></pre>
 </li>
 </ul>
 </li>
@@ -1816,7 +1820,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LoadTestTool</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.69">LoadTestTool</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.76">LoadTestTool</a>()</pre>
 </li>
 </ul>
 </li>
@@ -1833,7 +1837,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>splitColonSeparated</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.232">splitColonSeparated</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;option,
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.239">splitColonSeparated</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;option,
                                        int&nbsp;minNumCols,
                                        int&nbsp;maxNumCols)</pre>
 </li>
@@ -1844,7 +1848,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumThreads</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.245">getNumThreads</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;numThreadsStr)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.252">getNumThreads</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;numThreadsStr)</pre>
 </li>
 </ul>
 <a name="getColumnFamilies--">
@@ -1853,7 +1857,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumnFamilies</h4>
-<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.249">getColumnFamilies</a>()</pre>
+<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.256">getColumnFamilies</a>()</pre>
 </li>
 </ul>
 <a name="applyColumnFamilyOptions-org.apache.hadoop.hbase.TableName-byte:A:A-">
@@ -1862,7 +1866,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>applyColumnFamilyOptions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.257">applyColumnFamilyOptions</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.264">applyColumnFamilyOptions</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                         byte[][]&nbsp;columnFamilies)
                                  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">Apply column family options such as Bloom filters, compression, and data
@@ -1879,20 +1883,33 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>addOptions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.309">addOptions</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.316">addOptions</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>addOptions</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.util.AbstractHBaseTool</code></dd>
 </dl>
 </li>
 </ul>
+<a name="newParser--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>newParser</h4>
+<pre>protected&nbsp;org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.369">newParser</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code>newParser</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.util.AbstractHBaseTool</code></dd>
+</dl>
+</li>
+</ul>
 <a name="processOptions-org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>processOptions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.362">processOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.403">processOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>processOptions</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.util.AbstractHBaseTool</code></dd>
@@ -1905,7 +1922,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseColumnFamilyOptions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.507">parseColumnFamilyOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.534">parseColumnFamilyOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="initTestTable--">
@@ -1914,7 +1931,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>initTestTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.527">initTestTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.554">initTestTable</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>
@@ -1928,7 +1945,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doWork</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.540">doWork</a>()
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.567">doWork</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>
@@ -1944,7 +1961,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>loadTable</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.548">loadTable</a>()
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.575">loadTable</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>
@@ -1958,7 +1975,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getLoadGeneratorInstance</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.740">getLoadGeneratorInstance</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;clazzName)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.767">getLoadGeneratorInstance</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;clazzName)
                                                 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>
@@ -1972,7 +1989,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiThreadedWriterInstance</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedWriter.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedWriter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.752">getMultiThreadedWriterInstance</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;clazzName,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedWriter.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedWriter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.779">getMultiThreadedWriterInstance</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;clazzName,
                                                            <a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a>&nbsp;dataGen)
                                                     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>
@@ -1987,7 +2004,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiThreadedUpdaterInstance</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedUpdater.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedUpdater</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.764">getMultiThreadedUpdaterInstance</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;clazzName,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedUpdater.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedUpdater</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.791">getMultiThreadedUpdaterInstance</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;clazzName,
                                                              <a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a>&nbsp;dataGen)
                                                       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>
@@ -2002,7 +2019,7 @@ extends org.apache.hadoop.hbase.util.AbstractHBaseTool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiThreadedReaderInstance</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/MultiThreadedReader.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedReader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.777">getMultiThreadedReaderI

<TRUNCATED>

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

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


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

Branch: refs/heads/asf-site
Commit: 839437eec5532f806a278a9e0af15e835f41b36a
Parents: 424223a
Author: jenkins <bu...@apache.org>
Authored: Sat Mar 31 14:47:51 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sat Mar 31 14:47:51 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 21632 +++++++++--------
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     2 +-
 .../hadoop/hbase/snapshot/SnapshotInfo.html     |     2 +-
 .../apache/hadoop/hbase/util/RegionMover.html   |     2 +-
 book.html                                       |    99 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |    64 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |     4 +
 .../hadoop/hbase/backup/BackupDriver.html       |     2 +-
 .../hadoop/hbase/backup/RestoreDriver.html      |     2 +-
 .../MapReduceBackupCopyJob.SnapshotCopy.html    |     2 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    22 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    18 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html |    22 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     4 +-
 .../hadoop/hbase/snapshot/CreateSnapshot.html   |     2 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     2 +-
 .../hadoop/hbase/snapshot/SnapshotInfo.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |    36 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |    40 +-
 .../hbase/tool/Canary.RegionServerMonitor.html  |    20 +-
 .../hbase/tool/Canary.ZookeeperMonitor.html     |    14 +-
 .../org/apache/hadoop/hbase/tool/Canary.html    |     8 +-
 .../hadoop/hbase/util/AbstractHBaseTool.html    |    76 +-
 .../apache/hadoop/hbase/util/RegionMover.html   |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    10 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |  1491 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |  1491 +-
 .../hbase/tool/Canary.RegionServerMonitor.html  |  1491 +-
 .../tool/Canary.RegionServerStdOutSink.html     |  1491 +-
 .../hbase/tool/Canary.RegionServerTask.html     |  1491 +-
 .../hbase/tool/Canary.RegionStdOutSink.html     |  1491 +-
 .../hbase/tool/Canary.RegionTask.TaskType.html  |  1491 +-
 .../hadoop/hbase/tool/Canary.RegionTask.html    |  1491 +-
 .../apache/hadoop/hbase/tool/Canary.Sink.html   |  1491 +-
 .../hadoop/hbase/tool/Canary.StdOutSink.html    |  1491 +-
 .../hbase/tool/Canary.ZookeeperMonitor.html     |  1491 +-
 .../hbase/tool/Canary.ZookeeperStdOutSink.html  |  1491 +-
 .../hadoop/hbase/tool/Canary.ZookeeperTask.html |  1491 +-
 .../org/apache/hadoop/hbase/tool/Canary.html    |  1491 +-
 ...bstractHBaseTool.OptionsOrderComparator.html |   238 +-
 .../hadoop/hbase/util/AbstractHBaseTool.html    |   238 +-
 .../util/RegionSplitter.DecimalStringSplit.html |     6 +-
 .../util/RegionSplitter.HexStringSplit.html     |     6 +-
 .../util/RegionSplitter.NumberStringSplit.html  |     6 +-
 .../util/RegionSplitter.SplitAlgorithm.html     |     6 +-
 .../hbase/util/RegionSplitter.UniformSplit.html |     6 +-
 .../hadoop/hbase/util/RegionSplitter.html       |     6 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/index-all.html                   |     2 +
 .../hadoop/hbase/AcidGuaranteesTestTool.html    |     2 +-
 .../hbase/IntegrationTestAcidGuarantees.html    |     2 +-
 .../hbase/IntegrationTestBackupRestore.html     |     2 +-
 .../hadoop/hbase/IntegrationTestBase.html       |     2 +-
 .../hbase/IntegrationTestDDLMasterFailover.html |     2 +-
 .../hadoop/hbase/IntegrationTestIngest.html     |     2 +-
 .../IntegrationTestIngestStripeCompactions.html |     2 +-
 .../hbase/IntegrationTestIngestWithACL.html     |     2 +-
 .../IntegrationTestIngestWithEncryption.html    |     2 +-
 .../hbase/IntegrationTestIngestWithMOB.html     |     2 +-
 .../hbase/IntegrationTestIngestWithTags.html    |     2 +-
 ...tegrationTestIngestWithVisibilityLabels.html |     2 +-
 .../hbase/IntegrationTestRegionReplicaPerf.html |     2 +-
 ...IntegrationTestRegionReplicaReplication.html |     2 +-
 .../hadoop/hbase/IntegrationTestsDriver.html    |     2 +-
 .../hadoop/hbase/ScanPerformanceEvaluation.html |     2 +-
 .../StripeCompactionsPerformanceEvaluation.html |     2 +-
 .../hbase/chaos/util/ChaosMonkeyRunner.html     |     2 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../mapreduce/IntegrationTestBulkLoad.html      |     2 +-
 ...IntegrationTestTableSnapshotInputFormat.html |     2 +-
 .../LoadBalancerPerformanceEvaluation.html      |     2 +-
 ...ProcedureSchedulerPerformanceEvaluation.html |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 ...ProcedureWALLoaderPerformanceEvaluation.html |     2 +-
 .../wal/ProcedureWALPerformanceEvaluation.html  |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 .../test/IntegrationTestBigLinkedList.html      |     2 +-
 ...egrationTestBigLinkedListWithVisibility.html |     2 +-
 .../test/IntegrationTestLoadAndVerify.html      |     2 +-
 .../hbase/test/IntegrationTestMonkeys.html      |     2 +-
 .../hbase/test/IntegrationTestReplication.html  |     2 +-
 ...undedMultiGetRequestsWithRegionReplicas.html |     2 +-
 ...stTimeBoundedRequestsWithRegionReplicas.html |     2 +-
 ...tionTestWithCellVisibilityLoadAndVerify.html |     2 +-
 .../test/IntegrationTestZKAndFSPermissions.html |     2 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../trace/IntegrationTestSendTraceRequests.html |     2 +-
 .../util/AbstractHBaseToolTest.TestTool.html    |     2 +-
 .../hbase/util/LoadTestTool.WorkerThread.html   |     8 +-
 .../apache/hadoop/hbase/util/LoadTestTool.html  |   263 +-
 .../hadoop/hbase/util/RestartMetaTest.html      |     2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../hbase/util/LoadTestTool.WorkerThread.html   |  1695 +-
 .../apache/hadoop/hbase/util/LoadTestTool.html  |  1695 +-
 141 files changed, 23923 insertions(+), 23501 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 267d885..d64d327 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="20180330" />
+    <meta name="Date-Revision-yyyymmdd" content="20180331" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -591,7 +591,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-03-30</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-31</li>
             </p>
                 </div>
 


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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        admin.enableTable(writeTableName);<a

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
index 1c5ace7..b8afbb7 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html
@@ -66,858 +66,885 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.util.test.LoadTestDataGenerator;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.test.LoadTestDataGeneratorWithACL;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.util.ToolRunner;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * A command-line utility that reads, writes, and verifies data. Unlike<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * {@link org.apache.hadoop.hbase.PerformanceEvaluation}, this tool validates the data written,<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * and supports simultaneously writing and reading the same set of keys.<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class LoadTestTool extends AbstractHBaseTool {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(LoadTestTool.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static final String COLON = ":";<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  /** Table name for the test */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private TableName tableName;<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  /** Column families for the test */<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private byte[][] families;<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  /** Table name to use of not overridden on the command line */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  protected static final String DEFAULT_TABLE_NAME = "cluster_test";<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  /** The default data size if not specified */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  protected static final int DEFAULT_DATA_SIZE = 64;<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /** The number of reader/writer threads if not specified */<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  protected static final int DEFAULT_NUM_THREADS = 20;<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  /** Usage string for the load option */<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  protected static final String OPT_USAGE_LOAD =<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      "&lt;avg_cols_per_key&gt;:&lt;avg_data_size&gt;" +<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      "[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  /** Usage string for the read option */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  protected static final String OPT_USAGE_READ =<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      "&lt;verify_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  /** Usage string for the update option */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  protected static final String OPT_USAGE_UPDATE =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      "&lt;update_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      + "&gt;][:&lt;#whether to ignore nonce collisions=0&gt;]";<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  protected static final String OPT_USAGE_BLOOM = "Bloom filter type, one of " +<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      Arrays.toString(BloomType.values());<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  protected static final String OPT_USAGE_COMPRESSION = "Compression type, " +<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      "one of " + Arrays.toString(Compression.Algorithm.values());<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public static final String OPT_BLOOM = "bloom";<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static final String OPT_COMPRESSION = "compression";<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public static final String OPT_DEFERRED_LOG_FLUSH = "deferredlogflush";<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static final String OPT_DEFERRED_LOG_FLUSH_USAGE = "Enable deferred log flush.";<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public static final String OPT_INMEMORY = "in_memory";<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public static final String OPT_USAGE_IN_MEMORY = "Tries to keep the HFiles of the CF " +<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      "inmemory as far as possible.  Not guaranteed that reads are always served from inmemory";<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  public static final String OPT_GENERATOR = "generator";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  public static final String OPT_GENERATOR_USAGE = "The class which generates load for the tool."<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      + " Any args for this class can be passed as colon separated after class name";<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public static final String OPT_WRITER = "writer";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public static final String OPT_WRITER_USAGE = "The class for executing the write requests";<a name="line.123"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.AlreadySelectedException;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.DefaultParser;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.MissingOptionException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.Options;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.org.apache.commons.cli.ParseException;<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>/**<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * A command-line utility that reads, writes, and verifies data. Unlike<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * {@link org.apache.hadoop.hbase.PerformanceEvaluation}, this tool validates the data written,<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * and supports simultaneously writing and reading the same set of keys.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.75"></a>
+<span class="sourceLineNo">076</span>public class LoadTestTool extends AbstractHBaseTool {<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static final Logger LOG = LoggerFactory.getLogger(LoadTestTool.class);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static final String COLON = ":";<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  /** Table name for the test */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private TableName tableName;<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  /** Column families for the test */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private byte[][] families;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  /** Table name to use of not overridden on the command line */<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected static final String DEFAULT_TABLE_NAME = "cluster_test";<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /** The default data size if not specified */<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  protected static final int DEFAULT_DATA_SIZE = 64;<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  /** The number of reader/writer threads if not specified */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  protected static final int DEFAULT_NUM_THREADS = 20;<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  /** Usage string for the load option */<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected static final String OPT_USAGE_LOAD =<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      "&lt;avg_cols_per_key&gt;:&lt;avg_data_size&gt;" +<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      "[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  /** Usage string for the read option */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  protected static final String OPT_USAGE_READ =<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      "&lt;verify_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS + "&gt;]";<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  /** Usage string for the update option */<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  protected static final String OPT_USAGE_UPDATE =<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      "&lt;update_percent&gt;[:&lt;#threads=" + DEFAULT_NUM_THREADS<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      + "&gt;][:&lt;#whether to ignore nonce collisions=0&gt;]";<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final String OPT_USAGE_BLOOM = "Bloom filter type, one of " +<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      Arrays.toString(BloomType.values());<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  protected static final String OPT_USAGE_COMPRESSION = "Compression type, " +<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      "one of " + Arrays.toString(Compression.Algorithm.values());<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public static final String OPT_BLOOM = "bloom";<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  public static final String OPT_COMPRESSION = "compression";<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public static final String OPT_DEFERRED_LOG_FLUSH = "deferredlogflush";<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  public static final String OPT_DEFERRED_LOG_FLUSH_USAGE = "Enable deferred log flush.";<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public static final String OPT_INMEMORY = "in_memory";<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public static final String OPT_USAGE_IN_MEMORY = "Tries to keep the HFiles of the CF " +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      "inmemory as far as possible.  Not guaranteed that reads are always served from inmemory";<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static final String OPT_UPDATER = "updater";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static final String OPT_UPDATER_USAGE = "The class for executing the update requests";<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public static final String OPT_READER = "reader";<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public static final String OPT_READER_USAGE = "The class for executing the read requests";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  protected static final String OPT_KEY_WINDOW = "key_window";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  protected static final String OPT_WRITE = "write";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  protected static final String OPT_MAX_READ_ERRORS = "max_read_errors";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  public static final String OPT_MULTIPUT = "multiput";<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static final String OPT_MULTIGET = "multiget_batchsize";<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  protected static final String OPT_NUM_KEYS = "num_keys";<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  protected static final String OPT_READ = "read";<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  protected static final String OPT_START_KEY = "start_key";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public static final String OPT_TABLE_NAME = "tn";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String OPT_COLUMN_FAMILIES = "families";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  protected static final String OPT_ZK_QUORUM = "zk";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  protected static final String OPT_ZK_PARENT_NODE = "zk_root";<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  protected static final String OPT_SKIP_INIT = "skip_init";<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  protected static final String OPT_INIT_ONLY = "init_only";<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  protected static final String NUM_TABLES = "num_tables";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  protected static final String OPT_BATCHUPDATE = "batchupdate";<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  protected static final String OPT_UPDATE = "update";<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  public static final String OPT_ENCRYPTION = "encryption";<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  protected static final String OPT_ENCRYPTION_USAGE =<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    "Enables transparent encryption on the test table, one of " +<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    Arrays.toString(Encryption.getSupportedCiphers());<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static final String OPT_NUM_REGIONS_PER_SERVER = "num_regions_per_server";<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  protected static final String OPT_NUM_REGIONS_PER_SERVER_USAGE<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    = "Desired number of regions per region server. Defaults to 5.";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static int DEFAULT_NUM_REGIONS_PER_SERVER = 5;<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  public static final String OPT_REGION_REPLICATION = "region_replication";<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  protected static final String OPT_REGION_REPLICATION_USAGE =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      "Desired number of replicas per region";<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static final String OPT_REGION_REPLICA_ID = "region_replica_id";<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  protected static final String OPT_REGION_REPLICA_ID_USAGE =<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      "Region replica id to do the reads from";<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public static final String OPT_MOB_THRESHOLD = "mob_threshold";<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  protected static final String OPT_MOB_THRESHOLD_USAGE =<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      "Desired cell size to exceed in bytes that will use the MOB write path";<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  protected static final long DEFAULT_START_KEY = 0;<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  /** This will be removed as we factor out the dependency on command line */<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  protected CommandLine cmd;<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>  protected MultiThreadedWriter writerThreads = null;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  protected MultiThreadedReader readerThreads = null;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  protected MultiThreadedUpdater updaterThreads = null;<a name="line.178"></a>
+<span class="sourceLineNo">125</span>  public static final String OPT_GENERATOR = "generator";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static final String OPT_GENERATOR_USAGE = "The class which generates load for the tool."<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      + " Any args for this class can be passed as colon separated after class name";<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public static final String OPT_WRITER = "writer";<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  public static final String OPT_WRITER_USAGE = "The class for executing the write requests";<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public static final String OPT_UPDATER = "updater";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public static final String OPT_UPDATER_USAGE = "The class for executing the update requests";<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  public static final String OPT_READER = "reader";<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public static final String OPT_READER_USAGE = "The class for executing the read requests";<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  protected static final String OPT_KEY_WINDOW = "key_window";<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  protected static final String OPT_WRITE = "write";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  protected static final String OPT_MAX_READ_ERRORS = "max_read_errors";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String OPT_MULTIPUT = "multiput";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final String OPT_MULTIGET = "multiget_batchsize";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  protected static final String OPT_NUM_KEYS = "num_keys";<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  protected static final String OPT_READ = "read";<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  protected static final String OPT_START_KEY = "start_key";<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final String OPT_TABLE_NAME = "tn";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final String OPT_COLUMN_FAMILIES = "families";<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  protected static final String OPT_ZK_QUORUM = "zk";<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  protected static final String OPT_ZK_PARENT_NODE = "zk_root";<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  protected static final String OPT_SKIP_INIT = "skip_init";<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  protected static final String OPT_INIT_ONLY = "init_only";<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  protected static final String NUM_TABLES = "num_tables";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  protected static final String OPT_BATCHUPDATE = "batchupdate";<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  protected static final String OPT_UPDATE = "update";<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public static final String OPT_ENCRYPTION = "encryption";<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  protected static final String OPT_ENCRYPTION_USAGE =<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    "Enables transparent encryption on the test table, one of " +<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    Arrays.toString(Encryption.getSupportedCiphers());<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public static final String OPT_NUM_REGIONS_PER_SERVER = "num_regions_per_server";<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  protected static final String OPT_NUM_REGIONS_PER_SERVER_USAGE<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    = "Desired number of regions per region server. Defaults to 5.";<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  public static int DEFAULT_NUM_REGIONS_PER_SERVER = 5;<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public static final String OPT_REGION_REPLICATION = "region_replication";<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  protected static final String OPT_REGION_REPLICATION_USAGE =<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      "Desired number of replicas per region";<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public static final String OPT_REGION_REPLICA_ID = "region_replica_id";<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  protected static final String OPT_REGION_REPLICA_ID_USAGE =<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Region replica id to do the reads from";<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  public static final String OPT_MOB_THRESHOLD = "mob_threshold";<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  protected static final String OPT_MOB_THRESHOLD_USAGE =<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Desired cell size to exceed in bytes that will use the MOB write path";<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  protected static final long DEFAULT_START_KEY = 0;<a name="line.178"></a>
 <span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  protected long startKey, endKey;<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>  protected boolean isWrite, isRead, isUpdate;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  protected boolean deferredLogFlush;<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  // Column family options<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  protected DataBlockEncoding dataBlockEncodingAlgo;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  protected Compression.Algorithm compressAlgo;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  protected BloomType bloomType;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  private boolean inMemoryCF;<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private User userOwner;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  // Writer options<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected int numWriterThreads = DEFAULT_NUM_THREADS;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected int minColsPerKey, maxColsPerKey;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  protected int minColDataSize = DEFAULT_DATA_SIZE, maxColDataSize = DEFAULT_DATA_SIZE;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  protected boolean isMultiPut;<a name="line.196"></a>
+<span class="sourceLineNo">180</span>  /** This will be removed as we factor out the dependency on command line */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  protected CommandLine cmd;<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  protected MultiThreadedWriter writerThreads = null;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  protected MultiThreadedReader readerThreads = null;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  protected MultiThreadedUpdater updaterThreads = null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  protected long startKey, endKey;<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  protected boolean isWrite, isRead, isUpdate;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  protected boolean deferredLogFlush;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>  // Column family options<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  protected DataBlockEncoding dataBlockEncodingAlgo;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected Compression.Algorithm compressAlgo;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  protected BloomType bloomType;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  private boolean inMemoryCF;<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  // Updater options<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  protected int numUpdaterThreads = DEFAULT_NUM_THREADS;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  protected int updatePercent;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  protected boolean ignoreConflicts = false;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  protected boolean isBatchUpdate;<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>  // Reader options<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  private int numReaderThreads = DEFAULT_NUM_THREADS;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private int keyWindow = MultiThreadedReader.DEFAULT_KEY_WINDOW;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  private int multiGetBatchSize = MultiThreadedReader.DEFAULT_BATCH_SIZE;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private int maxReadErrors = MultiThreadedReader.DEFAULT_MAX_ERRORS;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private int verifyPercent;<a name="line.209"></a>
+<span class="sourceLineNo">198</span>  private User userOwner;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  // Writer options<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  protected int numWriterThreads = DEFAULT_NUM_THREADS;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  protected int minColsPerKey, maxColsPerKey;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected int minColDataSize = DEFAULT_DATA_SIZE, maxColDataSize = DEFAULT_DATA_SIZE;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected boolean isMultiPut;<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  // Updater options<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  protected int numUpdaterThreads = DEFAULT_NUM_THREADS;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  protected int updatePercent;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  protected boolean ignoreConflicts = false;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  protected boolean isBatchUpdate;<a name="line.209"></a>
 <span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  private int numTables = 1;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  private String superUser;<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private String userNames;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  //This file is used to read authentication information in secure clusters.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private String authnFileName;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private int numRegionsPerServer = DEFAULT_NUM_REGIONS_PER_SERVER;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private int regionReplication = -1; // not set<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private int regionReplicaId = -1; // not set<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  private int mobThreshold = -1; // not set<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  // TODO: refactor LoadTestToolImpl somewhere to make the usage from tests less bad,<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  //       console tool itself should only be used from console.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  protected boolean isSkipInit = false;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected boolean isInitOnly = false;<a name="line.228"></a>
+<span class="sourceLineNo">211</span>  // Reader options<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private int numReaderThreads = DEFAULT_NUM_THREADS;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  private int keyWindow = MultiThreadedReader.DEFAULT_KEY_WINDOW;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  private int multiGetBatchSize = MultiThreadedReader.DEFAULT_BATCH_SIZE;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  private int maxReadErrors = MultiThreadedReader.DEFAULT_MAX_ERRORS;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private int verifyPercent;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  private int numTables = 1;<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  private String superUser;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  private String userNames;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  //This file is used to read authentication information in secure clusters.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  private String authnFileName;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private int numRegionsPerServer = DEFAULT_NUM_REGIONS_PER_SERVER;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private int regionReplication = -1; // not set<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private int regionReplicaId = -1; // not set<a name="line.228"></a>
 <span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>  protected Cipher cipher = null;<a name="line.230"></a>
+<span class="sourceLineNo">230</span>  private int mobThreshold = -1; // not set<a name="line.230"></a>
 <span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  protected String[] splitColonSeparated(String option,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      int minNumCols, int maxNumCols) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    String optVal = cmd.getOptionValue(option);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    String[] cols = optVal.split(COLON);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (cols.length &lt; minNumCols || cols.length &gt; maxNumCols) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      throw new IllegalArgumentException("Expected at least "<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          + minNumCols + " columns but no more than " + maxNumCols +<a name="line.238"></a>
-<span class="sourceLineNo">239</span>          " in the colon-separated value '" + optVal + "' of the " +<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          "-" + option + " option");<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return cols;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  protected int getNumThreads(String numThreadsStr) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return parseInt(numThreadsStr, 1, Short.MAX_VALUE);<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>  public byte[][] getColumnFamilies() {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    return families;<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>   * Apply column family options such as Bloom filters, compression, and data<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * block encoding.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  protected void applyColumnFamilyOptions(TableName tableName,<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      byte[][] columnFamilies) throws IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        Admin admin = conn.getAdmin()) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      TableDescriptor tableDesc = admin.getDescriptor(tableName);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.info("Disabling table " + tableName);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      admin.disableTable(tableName);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      for (byte[] cf : columnFamilies) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        ColumnFamilyDescriptor columnDesc = tableDesc.getColumnFamily(cf);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        boolean isNewCf = columnDesc == null;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        ColumnFamilyDescriptorBuilder columnDescBuilder = isNewCf ?<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            ColumnFamilyDescriptorBuilder.newBuilder(cf) :<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            ColumnFamilyDescriptorBuilder.newBuilder(columnDesc);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        if (bloomType != null) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          columnDescBuilder.setBloomFilterType(bloomType);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        if (compressAlgo != null) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          columnDescBuilder.setCompressionType(compressAlgo);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        if (dataBlockEncodingAlgo != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          columnDescBuilder.setDataBlockEncoding(dataBlockEncodingAlgo);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        if (inMemoryCF) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          columnDescBuilder.setInMemory(inMemoryCF);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (cipher != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          byte[] keyBytes = new byte[cipher.getKeyLength()];<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          new SecureRandom().nextBytes(keyBytes);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          columnDescBuilder.setEncryptionType(cipher.getName());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          columnDescBuilder.setEncryptionKey(<a name="line.286"></a>
-<span class="sourceLineNo">287</span>              EncryptionUtil.wrapKey(conf,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>                  User.getCurrent().getShortName(),<a name="line.288"></a>
-<span class="sourceLineNo">289</span>                  new SecretKeySpec(keyBytes,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>                      cipher.getName())));<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (mobThreshold &gt;= 0) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          columnDescBuilder.setMobEnabled(true);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          columnDescBuilder.setMobThreshold(mobThreshold);<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>        if (isNewCf) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          admin.addColumnFamily(tableName, columnDescBuilder.build());<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        } else {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          admin.modifyColumnFamily(tableName, columnDescBuilder.build());<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      LOG.info("Enabling table " + tableName);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      admin.enableTable(tableName);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  @Override<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  protected void addOptions() {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    addOptWithArg(OPT_ZK_QUORUM, "ZK quorum as comma-separated host names " +<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        "without port numbers");<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    addOptWithArg(OPT_ZK_PARENT_NODE, "name of parent znode in zookeeper");<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    addOptWithArg(OPT_TABLE_NAME, "The name of the table to read or write");<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    addOptWithArg(OPT_COLUMN_FAMILIES, "The name of the column families to use separated by comma");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    addOptWithArg(OPT_WRITE, OPT_USAGE_LOAD);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    addOptWithArg(OPT_READ, OPT_USAGE_READ);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    addOptWithArg(OPT_UPDATE, OPT_USAGE_UPDATE);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    addOptNoArg(OPT_INIT_ONLY, "Initialize the test table only, don't do any loading");<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    addOptWithArg(OPT_BLOOM, OPT_USAGE_BLOOM);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    addOptWithArg(OPT_COMPRESSION, OPT_USAGE_COMPRESSION);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    addOptWithArg(HFileTestUtil.OPT_DATA_BLOCK_ENCODING, HFileTestUtil.OPT_DATA_BLOCK_ENCODING_USAGE);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    addOptWithArg(OPT_MAX_READ_ERRORS, "The maximum number of read errors " +<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        "to tolerate before terminating all reader threads. The default is " +<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        MultiThreadedReader.DEFAULT_MAX_ERRORS + ".");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    addOptWithArg(OPT_MULTIGET, "Whether to use multi-gets as opposed to " +<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        "separate gets for every column in a row");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    addOptWithArg(OPT_KEY_WINDOW, "The 'key window' to maintain between " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        "reads and writes for concurrent write/read workload. The default " +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        "is " + MultiThreadedReader.DEFAULT_KEY_WINDOW + ".");<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    addOptNoArg(OPT_MULTIPUT, "Whether to use multi-puts as opposed to " +<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        "separate puts for every column in a row");<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    addOptNoArg(OPT_BATCHUPDATE, "Whether to use batch as opposed to " +<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        "separate updates for every column in a row");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    addOptNoArg(OPT_INMEMORY, OPT_USAGE_IN_MEMORY);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    addOptWithArg(OPT_GENERATOR, OPT_GENERATOR_USAGE);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    addOptWithArg(OPT_WRITER, OPT_WRITER_USAGE);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    addOptWithArg(OPT_UPDATER, OPT_UPDATER_USAGE);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    addOptWithArg(OPT_READER, OPT_READER_USAGE);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    addOptWithArg(OPT_NUM_KEYS, "The number of keys to read/write");<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    addOptWithArg(OPT_START_KEY, "The first key to read/write " +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "(a 0-based index). The default value is " +<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        DEFAULT_START_KEY + ".");<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    addOptNoArg(OPT_SKIP_INIT, "Skip the initialization; assume test table "<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        + "already exists");<a name="line.346"></a>
+<span class="sourceLineNo">232</span>  // TODO: refactor LoadTestToolImpl somewhere to make the usage from tests less bad,<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  //       console tool itself should only be used from console.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  protected boolean isSkipInit = false;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  protected boolean isInitOnly = false;<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  protected Cipher cipher = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  protected String[] splitColonSeparated(String option,<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      int minNumCols, int maxNumCols) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    String optVal = cmd.getOptionValue(option);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    String[] cols = optVal.split(COLON);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    if (cols.length &lt; minNumCols || cols.length &gt; maxNumCols) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      throw new IllegalArgumentException("Expected at least "<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          + minNumCols + " columns but no more than " + maxNumCols +<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          " in the colon-separated value '" + optVal + "' of the " +<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          "-" + option + " option");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    return cols;<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>  protected int getNumThreads(String numThreadsStr) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return parseInt(numThreadsStr, 1, Short.MAX_VALUE);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public byte[][] getColumnFamilies() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return families;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * Apply column family options such as Bloom filters, compression, and data<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * block encoding.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  protected void applyColumnFamilyOptions(TableName tableName,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      byte[][] columnFamilies) throws IOException {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        Admin admin = conn.getAdmin()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      TableDescriptor tableDesc = admin.getDescriptor(tableName);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      LOG.info("Disabling table " + tableName);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      admin.disableTable(tableName);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      for (byte[] cf : columnFamilies) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        ColumnFamilyDescriptor columnDesc = tableDesc.getColumnFamily(cf);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        boolean isNewCf = columnDesc == null;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        ColumnFamilyDescriptorBuilder columnDescBuilder = isNewCf ?<a name="line.274"></a>
+<span class="sourceLineNo">275</span>            ColumnFamilyDescriptorBuilder.newBuilder(cf) :<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            ColumnFamilyDescriptorBuilder.newBuilder(columnDesc);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        if (bloomType != null) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          columnDescBuilder.setBloomFilterType(bloomType);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        if (compressAlgo != null) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          columnDescBuilder.setCompressionType(compressAlgo);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        if (dataBlockEncodingAlgo != null) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          columnDescBuilder.setDataBlockEncoding(dataBlockEncodingAlgo);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        if (inMemoryCF) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          columnDescBuilder.setInMemory(inMemoryCF);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        if (cipher != null) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          byte[] keyBytes = new byte[cipher.getKeyLength()];<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          new SecureRandom().nextBytes(keyBytes);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          columnDescBuilder.setEncryptionType(cipher.getName());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          columnDescBuilder.setEncryptionKey(<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              EncryptionUtil.wrapKey(conf,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>                  User.getCurrent().getShortName(),<a name="line.295"></a>
+<span class="sourceLineNo">296</span>                  new SecretKeySpec(keyBytes,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                      cipher.getName())));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        if (mobThreshold &gt;= 0) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          columnDescBuilder.setMobEnabled(true);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          columnDescBuilder.setMobThreshold(mobThreshold);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>        if (isNewCf) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          admin.addColumnFamily(tableName, columnDescBuilder.build());<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        } else {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          admin.modifyColumnFamily(tableName, columnDescBuilder.build());<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>      LOG.info("Enabling table " + tableName);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      admin.enableTable(tableName);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  protected void addOptions() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    addOptWithArg(OPT_ZK_QUORUM, "ZK quorum as comma-separated host names " +<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        "without port numbers");<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    addOptWithArg(OPT_ZK_PARENT_NODE, "name of parent znode in zookeeper");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    addOptWithArg(OPT_TABLE_NAME, "The name of the table to read or write");<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    addOptWithArg(OPT_COLUMN_FAMILIES, "The name of the column families to use separated by comma");<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    addOptWithArg(OPT_WRITE, OPT_USAGE_LOAD);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    addOptWithArg(OPT_READ, OPT_USAGE_READ);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    addOptWithArg(OPT_UPDATE, OPT_USAGE_UPDATE);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    addOptNoArg(OPT_INIT_ONLY, "Initialize the test table only, don't do any loading");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    addOptWithArg(OPT_BLOOM, OPT_USAGE_BLOOM);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    addOptWithArg(OPT_COMPRESSION, OPT_USAGE_COMPRESSION);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    addOptWithArg(HFileTestUtil.OPT_DATA_BLOCK_ENCODING, HFileTestUtil.OPT_DATA_BLOCK_ENCODING_USAGE);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    addOptWithArg(OPT_MAX_READ_ERRORS, "The maximum number of read errors " +<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        "to tolerate before terminating all reader threads. The default is " +<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        MultiThreadedReader.DEFAULT_MAX_ERRORS + ".");<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    addOptWithArg(OPT_MULTIGET, "Whether to use multi-gets as opposed to " +<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        "separate gets for every column in a row");<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    addOptWithArg(OPT_KEY_WINDOW, "The 'key window' to maintain between " +<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        "reads and writes for concurrent write/read workload. The default " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        "is " + MultiThreadedReader.DEFAULT_KEY_WINDOW + ".");<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    addOptNoArg(OPT_MULTIPUT, "Whether to use multi-puts as opposed to " +<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        "separate puts for every column in a row");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    addOptNoArg(OPT_BATCHUPDATE, "Whether to use batch as opposed to " +<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        "separate updates for every column in a row");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    addOptNoArg(OPT_INMEMORY, OPT_USAGE_IN_MEMORY);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    addOptWithArg(OPT_GENERATOR, OPT_GENERATOR_USAGE);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    addOptWithArg(OPT_WRITER, OPT_WRITER_USAGE);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    addOptWithArg(OPT_UPDATER, OPT_UPDATER_USAGE);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    addOptWithArg(OPT_READER, OPT_READER_USAGE);<a name="line.346"></a>
 <span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    addOptWithArg(NUM_TABLES,<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      "A positive integer number. When a number n is specified, load test "<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          + "tool  will load n table parallely. -tn parameter value becomes "<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          + "table name prefix. Each table name is in format &lt;tn&gt;_1...&lt;tn&gt;_n");<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>    addOptWithArg(OPT_ENCRYPTION, OPT_ENCRYPTION_USAGE);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    addOptNoArg(OPT_DEFERRED_LOG_FLUSH, OPT_DEFERRED_LOG_FLUSH_USAGE);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    addOptWithArg(OPT_NUM_REGIONS_PER_SERVER, OPT_NUM_REGIONS_PER_SERVER_USAGE);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    addOptWithArg(OPT_REGION_REPLICATION, OPT_REGION_REPLICATION_USAGE);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    addOptWithArg(OPT_REGION_REPLICA_ID, OPT_REGION_REPLICA_ID_USAGE);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    addOptWithArg(OPT_MOB_THRESHOLD, OPT_MOB_THRESHOLD_USAGE);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>  @Override<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  protected void processOptions(CommandLine cmd) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    this.cmd = cmd;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    tableName = TableName.valueOf(cmd.getOptionValue(OPT_TABLE_NAME,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        DEFAULT_TABLE_NAME));<a name="line.366"></a>
+<span class="sourceLineNo">348</span>    addOptWithArg(OPT_NUM_KEYS, "The number of keys to read/write");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    addOptWithArg(OPT_START_KEY, "The first key to read/write " +<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        "(a 0-based index). The default value is " +<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        DEFAULT_START_KEY + ".");<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    addOptNoArg(OPT_SKIP_INIT, "Skip the initialization; assume test table "<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        + "already exists");<a name="line.353"></a>
+<span class="sourceLineNo">354</span><a name="line.354"></a>
+<span class="sourceLineNo">355</span>    addOptWithArg(NUM_TABLES,<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      "A positive integer number. When a number n is specified, load test "<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          + "tool  will load n table parallely. -tn parameter value becomes "<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          + "table name prefix. Each table name is in format &lt;tn&gt;_1...&lt;tn&gt;_n");<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    addOptWithArg(OPT_ENCRYPTION, OPT_ENCRYPTION_USAGE);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    addOptNoArg(OPT_DEFERRED_LOG_FLUSH, OPT_DEFERRED_LOG_FLUSH_USAGE);<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    addOptWithArg(OPT_NUM_REGIONS_PER_SERVER, OPT_NUM_REGIONS_PER_SERVER_USAGE);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    addOptWithArg(OPT_REGION_REPLICATION, OPT_REGION_REPLICATION_USAGE);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    addOptWithArg(OPT_REGION_REPLICA_ID, OPT_REGION_REPLICA_ID_USAGE);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    addOptWithArg(OPT_MOB_THRESHOLD, OPT_MOB_THRESHOLD_USAGE);<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>    if (cmd.hasOption(OPT_COLUMN_FAMILIES)) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      String[] list = cmd.getOptionValue(OPT_COLUMN_FAMILIES).split(",");<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      families = new byte[list.length][];<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      for (int i = 0; i &lt; list.length; i++) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        families[i] = Bytes.toBytes(list[i]);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      families = HFileTestUtil.DEFAULT_COLUMN_FAMILIES;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    }<a name="line.376"></a>
+<span class="sourceLineNo">368</span>  @Override<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  protected CommandLineParser newParser() {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    // Commons-CLI lacks the capability to handle combinations of options, so we do it ourselves<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    // Validate in parse() to get helpful error messages instead of exploding in processOptions()<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return new DefaultParser() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      @Override<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      public CommandLine parse(Options opts, String[] args, Properties props, boolean stop)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          throws ParseException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        CommandLine cl = super.parse(opts, args, props, stop);<a name="line.376"></a>
 <span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>    isWrite = cmd.hasOption(OPT_WRITE);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    isRead = cmd.hasOption(OPT_READ);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    isUpdate = cmd.hasOption(OPT_UPDATE);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    isInitOnly = cmd.hasOption(OPT_INIT_ONLY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    deferredLogFlush = cmd.hasOption(OPT_DEFERRED_LOG_FLUSH);<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    if (!isWrite &amp;&amp; !isRead &amp;&amp; !isUpdate &amp;&amp; !isInitOnly) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      throw new IllegalArgumentException("Either -" + OPT_WRITE + " or " +<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        "-" + OPT_UPDATE + " or -" + OPT_READ + " has to be specified");<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>    if (isInitOnly &amp;&amp; (isRead || isWrite || isUpdate)) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      throw new IllegalArgumentException(OPT_INIT_ONLY + " cannot be specified with"<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          + " either -" + OPT_WRITE + " or -" + OPT_UPDATE + " or -" + OPT_READ);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    if (!isInitOnly) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      if (!cmd.hasOption(OPT_NUM_KEYS)) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        throw new IllegalArgumentException(OPT_NUM_KEYS + " must be specified in "<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            + "read or write mode");<a name="line.397"></a>
+<span class="sourceLineNo">378</span>        boolean isReadWriteUpdate = cmd.hasOption(OPT_READ)<a name="line.378"></a>
+<span class="sourceLineNo">379</span>            || cmd.hasOption(OPT_WRITE)<a name="line.379"></a>
+<span class="sourceLineNo">380</span>            || cmd.hasOption(OPT_UPDATE);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        boolean isInitOnly = cmd.hasOption(OPT_INIT_ONLY);<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if (!isInitOnly &amp;&amp; !isReadWriteUpdate) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          throw new MissingOptionException("Must specify either -" + OPT_INIT_ONLY<a name="line.384"></a>
+<span class="sourceLineNo">385</span>              + " or at least one of -" + OPT_READ + ", -" + OPT_WRITE + ", -" + OPT_UPDATE);<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>        if (isInitOnly &amp;&amp; isReadWriteUpdate) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          throw new AlreadySelectedException(OPT_INIT_ONLY + " cannot be specified with any of -"<a name="line.389"></a>
+<span class="sourceLineNo">390</span>              + OPT_READ + ", -" + OPT_WRITE + ", -" + OPT_UPDATE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>        if (isReadWriteUpdate &amp;&amp; !cmd.hasOption(OPT_NUM_KEYS)) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          throw new MissingOptionException(OPT_NUM_KEYS + " must be specified in read/write mode.");<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>        return cl;<a name="line.397"></a>
 <span class="sourceLineNo">398</span>      }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      startKey = parseLong(cmd.getOptionValue(OPT_START_KEY,<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          String.valueOf(DEFAULT_START_KEY)), 0, Long.MAX_VALUE);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      long numKeys = parseLong(cmd.getOptionValue(OPT_NUM_KEYS), 1,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          Long.MAX_VALUE - startKey);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      endKey = startKey + numKeys;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      isSkipInit = cmd.hasOption(OPT_SKIP_INIT);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      System.out.println("Key range: [" + startKey + ".." + (endKey - 1) + "]");<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>    parseColumnFamilyOptions(cmd);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (isWrite) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      String[] writeOpts = splitColonSeparated(OPT_WRITE, 2, 3);<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>      int colIndex = 0;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      minColsPerKey = 1;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      maxColsPerKey = 2 * Integer.parseInt(writeOpts[colIndex++]);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      int avgColDataSize =<a name="line.416"></a>
-<span class="sourceLineNo">417</span>          parseInt(writeOpts[colIndex++], 1, Integer.MAX_VALUE);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      minColDataSize = avgColDataSize / 2;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      maxColDataSize = avgColDataSize * 3 / 2;<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (colIndex &lt; writeOpts.length) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        numWriterThreads = getNumThreads(writeOpts[colIndex++]);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
+<span class="sourceLineNo">399</span>    };<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>  @Override<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  protected void processOptions(CommandLine cmd) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.cmd = cmd;<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>    tableName = TableName.valueOf(cmd.getOptionValue(OPT_TABLE_NAME,<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        DEFAULT_TABLE_NAME));<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>    if (cmd.hasOption(OPT_COLUMN_FAMILIES)) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      String[] list = cmd.getOptionValue(OPT_COLUMN_FAMILIES).split(",");<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      families = new byte[list.length][];<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      for (int i = 0; i &lt; list.length; i++) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        families[i] = Bytes.toBytes(list[i]);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    } else {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      families = HFileTestUtil.DEFAULT_COLUMN_FAMILIES;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>    isWrite = cmd.hasOption(OPT_WRITE);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    isRead = cmd.hasOption(OPT_READ);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    isUpdate = cmd.hasOption(OPT_UPDATE);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    isInitOnly = cmd.hasOption(OPT_INIT_ONLY);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    deferredLogFlush = cmd.hasOption(OPT_DEFERRED_LOG_FLUSH);<a name="line.423"></a>
 <span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      isMultiPut = cmd.hasOption(OPT_MULTIPUT);<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>      mobThreshold = -1;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      if (cmd.hasOption(OPT_MOB_THRESHOLD)) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        mobThreshold = Integer.parseInt(cmd.getOptionValue(OPT_MOB_THRESHOLD));<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>      System.out.println("Multi-puts: " + isMultiPut);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      System.out.println("Columns per key: " + minColsPerKey + ".."<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          + maxColsPerKey);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      System.out.println("Data size per column: " + minColDataSize + ".."<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          + maxColDataSize);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    if (isUpdate) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      String[] mutateOpts = splitColonSeparated(OPT_UPDATE, 1, 3);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      int colIndex = 0;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      updatePercent = parseInt(mutateOpts[colIndex++], 0, 100);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      if (colIndex &lt; mutateOpts.length) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        numUpdaterThreads = getNumThreads(mutateOpts[colIndex++]);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      if (colIndex &lt; mutateOpts.length) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        ignoreConflicts = parseInt(mutateOpts[colIndex++], 0, 1) == 1;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>      isBatchUpdate = cmd.hasOption(OPT_BATCHUPDATE);<a name="line.450"></a>
+<span class="sourceLineNo">425</span>    if (!isInitOnly) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      startKey = parseLong(cmd.getOptionValue(OPT_START_KEY,<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          String.valueOf(DEFAULT_START_KEY)), 0, Long.MAX_VALUE);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      long numKeys = parseLong(cmd.getOptionValue(OPT_NUM_KEYS), 1,<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          Long.MAX_VALUE - startKey);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      endKey = startKey + numKeys;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      isSkipInit = cmd.hasOption(OPT_SKIP_INIT);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      System.out.println("Key range: [" + startKey + ".." + (endKey - 1) + "]");<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>    parseColumnFamilyOptions(cmd);<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>    if (isWrite) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      String[] writeOpts = splitColonSeparated(OPT_WRITE, 2, 3);<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      int colIndex = 0;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      minColsPerKey = 1;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      maxColsPerKey = 2 * Integer.parseInt(writeOpts[colIndex++]);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      int avgColDataSize =<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          parseInt(writeOpts[colIndex++], 1, Integer.MAX_VALUE);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      minColDataSize = avgColDataSize / 2;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      maxColDataSize = avgColDataSize * 3 / 2;<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (colIndex &lt; writeOpts.length) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        numWriterThreads = getNumThreads(writeOpts[colIndex++]);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      }<a name="line.450"></a>
 <span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>      System.out.println("Batch updates: " + isBatchUpdate);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      System.out.println("Percent of keys to update: " + updatePercent);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      System.out.println("Updater threads: " + numUpdaterThreads);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      System.out.println("Ignore nonce conflicts: " + ignoreConflicts);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    if (isRead) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      String[] readOpts = splitColonSeparated(OPT_READ, 1, 2);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      int colIndex = 0;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      verifyPercent = parseInt(readOpts[colIndex++], 0, 100);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (colIndex &lt; readOpts.length) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        numReaderThreads = getNumThreads(readOpts[colIndex++]);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      }<a name="line.464"></a>
+<span class="sourceLineNo">452</span>      isMultiPut = cmd.hasOption(OPT_MULTIPUT);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>      mobThreshold = -1;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      if (cmd.hasOption(OPT_MOB_THRESHOLD)) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        mobThreshold = Integer.parseInt(cmd.getOptionValue(OPT_MOB_THRESHOLD));<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>      System.out.println("Multi-puts: " + isMultiPut);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      System.out.println("Columns per key: " + minColsPerKey + ".."<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          + maxColsPerKey);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      System.out.println("Data size per column: " + minColDataSize + ".."<a name="line.462"></a>
+<span class="sourceLineNo">463</span>          + maxColDataSize);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
 <span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (cmd.hasOption(OPT_MAX_READ_ERRORS)) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        maxReadErrors = parseInt(cmd.getOptionValue(OPT_MAX_READ_ERRORS),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>            0, Integer.MAX_VALUE);<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>      if (cmd.hasOption(OPT_KEY_WINDOW)) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        keyWindow = parseInt(cmd.getOptionValue(OPT_KEY_WINDOW),<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            0, Integer.MAX_VALUE);<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>      if (cmd.hasOption(OPT_MULTIGET)) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        multiGetBatchSize = parseInt(cmd.getOptionValue(OPT_MULTIGET),<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            0, Integer.MAX_VALUE);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>      System.out.println("Multi-gets (value of 1 means no multigets): " + multiGetBatchSize);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      System.out.println("Percent of keys to verify: " + verifyPercent);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      System.out.println("Reader threads: " + numReaderThreads);<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>    numTables = 1;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    if (cmd.hasOption(NUM_TABLES)) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      numTables = parseInt(cmd.getOptionValue(NUM_TABLES), 1, Short.MAX_VALUE);<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>    numRegionsPerServer = DEFAULT_NUM_REGIONS_PER_SERVER;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    if (cmd.hasOption(OPT_NUM_REGIONS_PER_SERVER)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      numRegionsPerServer = Integer.parseInt(cmd.getOptionValue(OPT_NUM_REGIONS_PER_SERVER));<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>    regionReplication = 1;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    if (cmd.hasOption(OPT_REGION_REPLICATION)) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      regionReplication = Integer.parseInt(cmd.getOptionValue(OPT_REGION_REPLICATION));<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    regionReplicaId = -1;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    if (cmd.hasOption(OPT_REGION_REPLICA_ID)) {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      regionReplicaId = Integer.parseInt(cmd.getOptionValue(OPT_REGION_REPLICA_ID));<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><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  private void parseColumnFamilyOptions(CommandLine cmd) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    String dataBlockEncodingStr = cmd.getOptionValue(HFileTestUtil.OPT_DATA_BLOCK_ENCODING);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    dataBlockEncodingAlgo = dataBlockEncodingStr == null ? null :<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        DataBlockEncoding.valueOf(dataBlockEncodingStr);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    String compressStr = cmd.getOptionValue(OPT_COMPRESSION);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    compressAlgo = compressStr == null ? Compression.Algorithm.NONE :<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        Compression.Algorithm.valueOf(compressStr);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    String bloomStr = cmd.getOptionValue(OPT_BLOOM);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    bloomType = bloomStr == null ? BloomType.ROW :<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        BloomType.valueOf(bloomStr);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    inMemoryCF = cmd.hasOption(OPT_INMEMORY);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    if (cmd.hasOption(OPT_ENCRYPTION)) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      cipher = Encryption.getCipher(conf, cmd.getOptionValue(OPT_ENCRYPTION));<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name=

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span c

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span c

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>        admin.

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span

<TRUNCATED>

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

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/839437ee/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 eff4c63..799d58c 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
@@ -845,753 +845,752 @@
 <span class="sourceLineNo">837</span>  }<a name="line.837"></a>
 <span class="sourceLineNo">838</span><a name="line.838"></a>
 <span class="sourceLineNo">839</span>  private void printUsageAndExit() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    System.err.printf(<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      "Usage: hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        getClass().getName());<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    System.err.println(" where [opts] are:");<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    System.err.println("   -help          Show this help and exit.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    System.err.println("      which means to enable regionserver mode");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    System.err.println("      only works in regionserver mode.");<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    System.err.println("      on each zookeeper instance");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        " default is true");<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.859"></a>
-<span class="sourceLineNo">860</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        + " Default is hbase:canary");<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        + " Default is false and raw is not enabled during scan");<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    System.err<a name="line.867"></a>
-<span class="sourceLineNo">868</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    System.exit(USAGE_EXIT_CODE);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * A Factory method for {@link Monitor}.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * Can be overridden by user.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * @param index a start index for monitor target<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param args args passed from user<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return a Monitor instance<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Monitor monitor = null;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    String[] monitorTargets = null;<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if(index &gt;= 0) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      int length = args.length - index;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      monitorTargets = new String[length];<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      monitor =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.891"></a>
-<span class="sourceLineNo">892</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>              this.treatFailureAsError);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      monitor =<a name="line.895"></a>
-<span class="sourceLineNo">896</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.896"></a>
-<span class="sourceLineNo">897</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    } else {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      monitor =<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.900"></a>
-<span class="sourceLineNo">901</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.902"></a>
-<span class="sourceLineNo">903</span>              this.configuredWriteTableTimeout);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    return monitor;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  // a Monitor super-class can be extended by users<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    protected Connection connection;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    protected Admin admin;<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    protected String[] targets;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    protected boolean useRegExp;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    protected boolean treatFailureAsError;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    protected boolean initialized = false;<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    protected boolean done = false;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    protected int errorCode = 0;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    protected Sink sink;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    protected ExecutorService executor;<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    public boolean isDone() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return done;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    public boolean hasError() {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return errorCode != 0;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>    public boolean finalCheckForErrors() {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      if (errorCode != 0) {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        return true;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (treatFailureAsError &amp;&amp;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return false;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    public void close() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      if (this.admin != null) this.admin.close();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      this.connection = connection;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      this.targets = monitorTargets;<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      this.useRegExp = useRegExp;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      this.sink = sink;<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      this.executor = executor;<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    @Override<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    public abstract void run();<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    protected boolean initAdmin() {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      if (null == this.admin) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        try {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          this.admin = this.connection.getAdmin();<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        } catch (Exception e) {<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>        }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      } else if (admin.isAborted()) {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        LOG.error("HBaseAdmin aborted");<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      return !this.hasError();<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span><a name="line.978"></a>
-<span class="sourceLineNo">979</span>  // a monitor for region mode<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  private static class RegionMonitor extends Monitor {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    // 10 minutes<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    // 1 days<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.984"></a>
-<span class="sourceLineNo">985</span><a name="line.985"></a>
-<span class="sourceLineNo">986</span>    private long lastCheckTime = -1;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    private boolean writeSniffing;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    private TableName writeTableName;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    private int writeDataTTL;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    private float regionsLowerLimit;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    private float regionsUpperLimit;<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    private int checkPeriod;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    private boolean rawScanEnabled;<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    private long configuredWriteTableTimeout;<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.998"></a>
-<span class="sourceLineNo">999</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>      Configuration conf = connection.getConfiguration();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      this.writeSniffing = writeSniffing;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      this.writeTableName = writeTableName;<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      this.writeDataTTL =<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      this.regionsLowerLimit =<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      this.regionsUpperLimit =<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      this.checkPeriod =<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span><a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private RegionStdOutSink getSink() {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      return ((RegionStdOutSink) sink);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    @Override<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    public void run() {<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      if (this.initAdmin()) {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        try {<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              return;<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>            }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            this.initialized = true;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>            for (String table : tables) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>                this.rawScanEnabled, readLatency));<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            }<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          } else {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          }<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span><a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          if (writeSniffing) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>              try {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>                checkWriteTableDistribution();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>              } catch (IOException e) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>              }<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            }<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>            // sniff canary table with write operation<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            regionSink.initializeWriteLatency();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          }<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span><a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>            try {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>              future.get();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            } catch (ExecutionException e) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>              LOG.error("Sniff region failed!", e);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>            String tableName = entry.getKey();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>              Long configured = entry.getValue();<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>              if (actual &gt; configured) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>              }<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>            } else {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          }<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          if (this.writeSniffing) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            }<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>          }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>        } catch (Exception e) {<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        } finally {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>          this.done = true;<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      this.done = true;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span><a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      String[] returnTables = null;<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span><a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      if (this.useRegExp) {<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>        Pattern pattern = null;<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        HTableDescriptor[] tds = null;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>        try {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          if (LOG.isDebugEnabled()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>          }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          tds = this.admin.listTables(pattern);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>          if (tds == null) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>            tds = new HTableDescriptor[0];<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>          for (String monitorTarget : monitorTargets) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            for (HTableDescriptor td : tds) {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                tmpTables.add(td.getNameAsString());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>              }<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>          }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        } catch (IOException e) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          LOG.error("Communicate with admin failed", e);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>          throw e;<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>        }<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>        if (tmpTables.size() &gt; 0) {<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>        } else {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>          LOG.error(msg);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>          throw new TableNotFoundException(msg);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>        }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      } else {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        returnTables = monitorTargets;<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>      }<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span><a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>      return returnTables;<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    }<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    /*<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>     * canary entry point to monitor all the tables.<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>     */<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      if (LOG.isDebugEnabled()) {<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>      }<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      return taskFutures;<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    }<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span><a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        int numberOfServers =<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        if (numberOfServers == 0) {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>          throw new IllegalStateException("No live regionservers");<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>        createWriteTable(numberOfServers);<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>      }<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>        admin.enableTable(writeTableName);<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>      }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      ClusterMetrics status =<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>          admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS, Option.MASTER));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      int numberOfServers = status.getLiveServerMetrics().size();<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>      if (status.getLiveServerMetrics().containsKey(status.getMasterName())) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>        numberOfServers -= 1;<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>      }<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs =<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int numberOfRegions = pairs.size();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        admin.disableTable(writeTableName);<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        admin.deleteTable(writeTableName);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        createWriteTable(numberOfServers);<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      }<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;&gt;();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>      for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        serverSet.add(pair.getSecond());<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>      int numberOfCoveredServers = serverSet.size();<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        admin.balancer();<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>      }<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span><a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>          + " and you can change it by config: "<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>      family.setMaxVersions(1);<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      family.setTimeToLive(writeDataTTL);<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      desc.addFamily(family);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      admin.createTable(desc, splits);<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>  }<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span><a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>  /**<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>   * Canary entry point for specified table.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>   * @throws Exception<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>   */<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      ExecutorService executor, TaskType taskType, boolean rawScanEnabled, LongAdder readLatency) throws Exception {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    if (LOG.isDebugEnabled()) {<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>        tableName));<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    }<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        executor, taskType, rawScanEnabled, readLatency);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    } else {<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    }<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    return new LinkedList&lt;&gt;();<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>  /*<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   * Loops over regions that owns this table, and output some information about the state.<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>   */<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType,<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      boolean rawScanEnabled, LongAdder rwLatency) throws Exception {<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    if (LOG.isDebugEnabled()) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span><a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>    Table table = null;<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>    try {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    } catch (TableNotFoundException e) {<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      return new ArrayList&lt;&gt;();<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    }<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    finally {<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>      if (table !=null) {<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        table.close();<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      }<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span><a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;&gt;();<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    RegionLocator regionLocator = null;<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    try {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      regionLocator = admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>      for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>        ServerName rs = location.getServerName();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        RegionInfo region = location.getRegionInfo();<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>        tasks.add(new RegionTask(admin.getConnection(), region, rs, (RegionStdOutSink) sink, taskType, rawScanEnabled,<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>          rwLatency));<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    } finally {<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      if (regionLocator != null) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>        regionLocator.close();<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    return executor.invokeAll(tasks);<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>  }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span><a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  //  monitor for zookeeper mode<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>  private static class ZookeeperMonitor extends Monitor {<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    private List&lt;String&gt; hosts;<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    private final String znode;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>    private final int timeout;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span><a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>    protected ZookeeperMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>        StdOutSink sink, ExecutorService executor, boolean treatFailureAsError)  {<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Configuration configuration = connection.getConfiguration();<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      znode =<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>          configuration.get(ZOOKEEPER_ZNODE_PARENT,<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>              DEFAULT_ZOOKEEPER_ZNODE_PARENT);<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      timeout = configuration<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>          .getInt(HConstants.ZK_SESSION_TIMEOUT, HConstants.DEFAULT_ZK_SESSION_TIMEOUT);<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      ConnectStringParser parser =<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>          new ConnectStringParser(ZKConfig.getZKQuorumServersString(configuration));<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      hosts = Lists.newArrayList();<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      for (InetSocketAddress server : parser.getServerAddresses()) {<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>        hosts.add(server.toString());<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>      }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    @Override public void run() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      List&lt;ZookeeperTask&gt; tasks = Lists.newArrayList();<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>      ZookeeperStdOutSink zkSink = null;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>      try {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>        zkSink = this.getSink();<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      } catch (RuntimeException e) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>        LOG.error("Run ZooKeeperMonitor failed!", e);<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      this.initialized = true;<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>      for (final String host : hosts) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>        tasks.add(new ZookeeperTask(connection, host, znode, timeout, zkSink));<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      try {<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>          try {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>            future.get();<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>          } catch (ExecutionException e) {<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            LOG.error("Sniff zookeeper failed!", e);<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>          }<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>        }<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      } catch (InterruptedException e) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        Thread.currentThread().interrupt();<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>        LOG.error("Sniff zookeeper interrupted!", e);<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      this.done = true;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span><a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    private ZookeeperStdOutSink getSink() {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      if (!(sink instanceof ZookeeperStdOutSink)) {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>        throw new RuntimeException("Can only write to zookeeper sink");<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      }<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      return ((ZookeeperStdOutSink) sink);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    }<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>  }<a name="line.1345"></a>
+<span class="sourceLineNo">840</span>    System.err.println(<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      "Usage: hbase canary [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]");<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    System.err.println(" where [opts] are:");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    System.err.println("   -help          Show this help and exit.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    System.err.println("      which means to enable regionserver mode");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    System.err.println("      only works in regionserver mode.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    System.err.println("   -zookeeper    Tries to grab zookeeper.znode.parent ");<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    System.err.println("      on each zookeeper instance");<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.854"></a>
+<span class="sourceLineNo">855</span>        " default is true");<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    System.err.println("   -writeTableTimeout &lt;N&gt;         write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    System.err.println("   -readTableTimeouts &lt;tableName&gt;=&lt;read timeout&gt;,&lt;tableName&gt;=&lt;read timeout&gt;, ...    "<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        + "comma-separated list of read timeouts per table (no spaces), default is 600000 (millisecs)");<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        + " Default is hbase:canary");<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    System.err.println("   -Dhbase.canary.read.raw.enabled=&lt;true/false&gt; Use this flag to enable or disable raw scan during read canary test"<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        + " Default is false and raw is not enabled during scan");<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    System.err<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * A Factory method for {@link Monitor}.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   * Can be overridden by user.<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   * @param index a start index for monitor target<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * @param args args passed from user<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * @return a Monitor instance<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   */<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    Monitor monitor = null;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    String[] monitorTargets = null;<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>    if(index &gt;= 0) {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      int length = args.length - index;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      monitorTargets = new String[length];<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.sink instanceof RegionServerStdOutSink || this.regionServerMode) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      monitor =<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.890"></a>
+<span class="sourceLineNo">891</span>              (StdOutSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.891"></a>
+<span class="sourceLineNo">892</span>              this.treatFailureAsError);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    } else if (this.sink instanceof ZookeeperStdOutSink || this.zookeeperMode) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      monitor =<a name="line.894"></a>
+<span class="sourceLineNo">895</span>          new ZookeeperMonitor(connection, monitorTargets, this.useRegExp,<a name="line.895"></a>
+<span class="sourceLineNo">896</span>              (StdOutSink) this.sink, this.executor, this.treatFailureAsError);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    } else {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      monitor =<a name="line.898"></a>
+<span class="sourceLineNo">899</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp,<a name="line.899"></a>
+<span class="sourceLineNo">900</span>              (StdOutSink) this.sink, this.executor, this.writeSniffing,<a name="line.900"></a>
+<span class="sourceLineNo">901</span>              this.writeTableName, this.treatFailureAsError, this.configuredReadTableTimeouts,<a name="line.901"></a>
+<span class="sourceLineNo">902</span>              this.configuredWriteTableTimeout);<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    }<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    return monitor;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
+<span class="sourceLineNo">906</span><a name="line.906"></a>
+<span class="sourceLineNo">907</span>  // a Monitor super-class can be extended by users<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>    protected Connection connection;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    protected Admin admin;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    protected String[] targets;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    protected boolean useRegExp;<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    protected boolean treatFailureAsError;<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    protected boolean initialized = false;<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    protected boolean done = false;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    protected int errorCode = 0;<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    protected Sink sink;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    protected ExecutorService executor;<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>    public boolean isDone() {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      return done;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    public boolean hasError() {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      return errorCode != 0;<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
+<span class="sourceLineNo">929</span><a name="line.929"></a>
+<span class="sourceLineNo">930</span>    public boolean finalCheckForErrors() {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (errorCode != 0) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        return true;<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      if (treatFailureAsError &amp;&amp;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0)) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        errorCode = FAILURE_EXIT_CODE;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        return true;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span>      return false;<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
+<span class="sourceLineNo">941</span><a name="line.941"></a>
+<span class="sourceLineNo">942</span>    @Override<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    public void close() throws IOException {<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      if (this.admin != null) this.admin.close();<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.948"></a>
+<span class="sourceLineNo">949</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>      this.connection = connection;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      this.targets = monitorTargets;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>      this.useRegExp = useRegExp;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      this.sink = sink;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      this.executor = executor;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    public abstract void run();<a name="line.960"></a>
+<span class="sourceLineNo">961</span><a name="line.961"></a>
+<span class="sourceLineNo">962</span>    protected boolean initAdmin() {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      if (null == this.admin) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>        try {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>          this.admin = this.connection.getAdmin();<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        } catch (Exception e) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      } else if (admin.isAborted()) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>        LOG.error("HBaseAdmin aborted");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return !this.hasError();<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>  }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>  // a monitor for region mode<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  private static class RegionMonitor extends Monitor {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    // 10 minutes<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    // 1 days<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    private long lastCheckTime = -1;<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    private boolean writeSniffing;<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    private TableName writeTableName;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    private int writeDataTTL;<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    private float regionsLowerLimit;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    private float regionsUpperLimit;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    private int checkPeriod;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    private boolean rawScanEnabled;<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    private HashMap&lt;String, Long&gt; configuredReadTableTimeouts;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    private long configuredWriteTableTimeout;<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        StdOutSink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        boolean treatFailureAsError, HashMap&lt;String, Long&gt; configuredReadTableTimeouts, long configuredWriteTableTimeout) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      Configuration conf = connection.getConfiguration();<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      this.writeSniffing = writeSniffing;<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      this.writeTableName = writeTableName;<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      this.writeDataTTL =<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      this.regionsLowerLimit =<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      this.regionsUpperLimit =<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      this.checkPeriod =<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      this.rawScanEnabled = conf.getBoolean(HConstants.HBASE_CANARY_READ_RAW_SCAN_KEY, false);<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      this.configuredReadTableTimeouts = new HashMap&lt;&gt;(configuredReadTableTimeouts);<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      this.configuredWriteTableTimeout = configuredWriteTableTimeout;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span><a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    private RegionStdOutSink getSink() {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>      if (!(sink instanceof RegionStdOutSink)) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        throw new RuntimeException("Can only write to Region sink");<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      return ((RegionStdOutSink) sink);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span><a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    @Override<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    public void run() {<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      if (this.initAdmin()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        try {<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          RegionStdOutSink regionSink = this.getSink();<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>            // Check to see that each table name passed in the -readTableTimeouts argument is also passed as a monitor target.<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>            if (! new HashSet&lt;&gt;(Arrays.asList(tables)).containsAll(this.configuredReadTableTimeouts.keySet())) {<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>              LOG.error("-readTableTimeouts can only specify read timeouts for monitor targets passed via command line.");<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>              this.errorCode = USAGE_EXIT_CODE;<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>              return;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>            }<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>            this.initialized = true;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>            for (String table : tables) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>              LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table);<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>              taskFutures.addAll(Canary.sniff(admin, regionSink, table, executor, TaskType.READ,<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>                this.rawScanEnabled, readLatency));<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>          } else {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            taskFutures.addAll(sniff(TaskType.READ, regionSink));<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>          if (writeSniffing) {<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              try {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                checkWriteTableDistribution();<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>              } catch (IOException e) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>              }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            }<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            // sniff canary table with write operation<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            regionSink.initializeWriteLatency();<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>            LongAdder writeTableLatency = regionSink.getWriteLatency();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            taskFutures.addAll(Canary.sniff(admin, regionSink, admin.getTableDescriptor(writeTableName),<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              executor, TaskType.WRITE, this.rawScanEnabled, writeTableLatency));<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>          }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span><a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            try {<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>              future.get();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>            } catch (ExecutionException e) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>              LOG.error("Sniff region failed!", e);<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            }<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>          }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>          Map&lt;String, LongAdder&gt; actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>          for (Map.Entry&lt;String, Long&gt; entry : configuredReadTableTimeouts.entrySet()) {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>            String tableName = entry.getKey();<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            if (actualReadTableLatency.containsKey(tableName)) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>              Long actual = actualReadTableLatency.get(tableName).longValue();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>              Long configured = entry.getValue();<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>              LOG.info("Read operation for " + tableName + " took " + actual +<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>                " ms. The configured read timeout was " + configured + " ms.");<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>              if (actual &gt; configured) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>                LOG.error("Read operation for " + tableName + " exceeded the configured read timeout.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>              }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>            } else {<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>              LOG.error("Read operation for " + tableName + " failed!");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>            }<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          }<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>          if (this.writeSniffing) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            String writeTableStringName = this.writeTableName.getNameAsString();<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            long actualWriteLatency = regionSink.getWriteLatency().longValue();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.info("Write operation for " + writeTableStringName + " took " + actualWriteLatency + " ms. The configured write timeout was " +<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>              this.configuredWriteTableTimeout + " ms.");<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>            // Check that the writeTable write operation latency does not exceed the configured timeout.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>            if (actualWriteLatency &gt; this.configuredWriteTableTimeout) {<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>              LOG.error("Write operation for " + writeTableStringName + " exceeded the configured write timeout.");<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>            }<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>          }<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        } catch (Exception e) {<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>          LOG.error("Run regionMonitor failed", e);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>        } finally {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>          this.done = true;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>  }<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      this.done = true;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span><a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      String[] returnTables = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span><a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      if (this.useRegExp) {<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        Pattern pattern = null;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>        HTableDescriptor[] tds = null;<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;&gt;();<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>        try {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>          if (LOG.isDebugEnabled()) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>            LOG.debug(String.format("reading list of tables"));<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>          }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>          tds = this.admin.listTables(pattern);<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>          if (tds == null) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>            tds = new HTableDescriptor[0];<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>          }<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>          for (String monitorTarget : monitorTargets) {<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>            pattern = Pattern.compile(monitorTarget);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            for (HTableDescriptor td : tds) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>                tmpTables.add(td.getNameAsString());<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>              }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>            }<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          }<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>        } catch (IOException e) {<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>          LOG.error("Communicate with admin failed", e);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>          throw e;<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        }<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span><a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>        if (tmpTables.size() &gt; 0) {<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        } else {<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>          LOG.error(msg);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>          throw new TableNotFoundException(msg);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>        }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      } else {<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>        returnTables = monitorTargets;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>      }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span><a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return returnTables;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    /*<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>     * canary entry point to monitor all the tables.<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>     */<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType, RegionStdOutSink regionSink) throws Exception {<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>      if (LOG.isDebugEnabled()) {<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>      }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;&gt;();<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>          LongAdder readLatency = regionSink.initializeAndGetReadLatencyForTable(table.getNameAsString());<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType, this.rawScanEnabled, readLatency));<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>        }<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      return taskFutures;<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span><a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      if (!admin.tableExists(writeTableName)) {<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        int numberOfServers =<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>            admin.getClusterMetrics(EnumSet.of(Option.LIVE_SERVERS)).getLiveServerMetrics().size();<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>        if (numberOfServers == 0) {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>          throw new IllegalStateException("No live regionservers");<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>        }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        createWriteTable(numberOfServers);<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>      }<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span><a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.1177"></a>
+<span class="sourceLin

<TRUNCATED>