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> "<avg_cols_per_key>:<avg_data_size>" +<a name="line.91"></a>
-<span class="sourceLineNo">092</span> "[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<verify_percent>[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<update_percent>[:<#threads=" + DEFAULT_NUM_THREADS<a name="line.100"></a>
-<span class="sourceLineNo">101</span> + ">][:<#whether to ignore nonce collisions=0>]";<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> "<avg_cols_per_key>:<avg_data_size>" +<a name="line.98"></a>
+<span class="sourceLineNo">099</span> "[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<verify_percent>[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<update_percent>[:<#threads=" + DEFAULT_NUM_THREADS<a name="line.107"></a>
+<span class="sourceLineNo">108</span> + ">][:<#whether to ignore nonce collisions=0>]";<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 < minNumCols || cols.length > 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 >= 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 < minNumCols || cols.length > 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 >= 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 <tn>_1...<tn>_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 <tn>_1...<tn>_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 < 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 && !isRead && !isUpdate && !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 && (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 && !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 && 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 && !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 < 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 < 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 < 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 < 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 < 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 < 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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() + " <options>", "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() + " <options>", "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 < minValue || l > 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 < minValue || l > 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() + " <options>", "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() + " <options>", "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 < minValue || l > 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 < minValue || l > 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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 <TABLE> <SPLITALGORITHM>\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 –
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 – 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 – 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 – 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 – 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 – 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 –
Apache HBase (TM) Metrics
@@ -449,7 +449,7 @@ export HBASE_REGIONSERVER_OPTS="$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 –
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 – 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 – 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 – 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 – 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 – 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 – 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 –
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 –
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 – 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 – 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 – 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 – 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 – 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 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><E> (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><T>, 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 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 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 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><E> (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><T>, 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 <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 <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 <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 <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 <a href="https://docs.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 <a href="https://docs.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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.914">useRegExp</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.915">treatFailureAsError</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.916">initialized</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.918">done</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.919">errorCode</a></pre>
+<pre>protected 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 <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 <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 <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 <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 <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> connection,
+<pre>protected <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> 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>[] monitorTargets,
boolean useRegExp,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.923">isDone</a>()</pre>
+<pre>public boolean <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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.927">hasError</a>()</pre>
+<pre>public boolean <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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.931">finalCheckForErrors</a>()</pre>
+<pre>public boolean <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.944">close</a>()
+<pre>public void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.961">run</a>()</pre>
+<pre>public abstract void <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> in interface <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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.963">initAdmin</a>()</pre>
+<pre>protected boolean <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 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 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 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 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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.986">lastCheckTime</a></pre>
+<pre>private 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.987">writeSniffing</a></pre>
+<pre>private 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 <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 <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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.989">writeDataTTL</a></pre>
+<pre>private 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 float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.990">regionsLowerLimit</a></pre>
+<pre>private 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 float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.991">regionsUpperLimit</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.992">checkPeriod</a></pre>
+<pre>private 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.993">rawScanEnabled</a></pre>
+<pre>private 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 <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><<a href="https://docs.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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.994">configuredReadTableTimeouts</a></pre>
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a><<a href="https://docs.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>> <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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.995">configuredWriteTableTimeout</a></pre>
+<pre>private 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 <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> connection,
+<pre>public <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> 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>[] monitorTargets,
boolean useRegExp,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a> 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 <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1018">getSink</a>()</pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1026">run</a>()</pre>
+<pre>public void <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> in interface <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 <a href="https://docs.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.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>[] monitorTargets)
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <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>[] 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 <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><<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><<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>>> <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> taskType,
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<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><<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>>> <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> taskType,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a> 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1168">checkWriteTableDistribution</a>()
+<pre>private void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1208">createWriteTable</a>(int numberOfServers)
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.1207">createWriteTable</a>(int 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 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 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 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’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"><value></span>/etc/hbase/conf/keytab.krb5<span class="tag"></value></span>
<span class="tag"></property></span>
<span class="comment"><!-- optional params --></span>
-property<span class="error">></span>
+<span class="tag"><property></span>
<span class="tag"><name></span>hbase.client.dns.interface<span class="tag"></name></span>
<span class="tag"><value></span>default<span class="tag"></value></span>
<span class="tag"></property></span>
@@ -25946,14 +25947,46 @@ property<span class="error">></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 <TABLE> <SPLITALGORITHM>
+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 <region count> Create a new table with a pre-split number of
+ regions
+ -D <property=value> Override HBase Configuration Settings
+ -f <family:family:...> Column Families to create with new table.
+ Required with -c
+ --firstrow <arg> First Row in Table for Split Algorithm
+ -h Print this usage help
+ --lastrow <arg> Last Row in Table for Split Algorithm
+ -o <count> 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’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’re running HDFS with permissions enabled, those permissions will need to be updated before you run CompleteBulkLoad.</p>
@@ -26450,7 +26483,7 @@ Assuming you’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 –
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 – 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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 –
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 – 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 – 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 – 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 – 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 static final <a href="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 static final <a href="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 static final <a href="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> </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 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 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 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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> </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> </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> </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> </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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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><E> (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><T>, 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 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 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 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 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><E> (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><T>, 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><V>, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure<TEnvironment> (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><T>)
<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<TEnvironment> (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><T>)
+<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><V>, 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><E> (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><T>, 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 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 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><E> (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><T>, 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 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 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 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 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 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 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 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 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 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><E> (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><T>, 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 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 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 <a href="https://docs.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 <a href="https://docs.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 i,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html#line.903">WorkerThread</a>(int 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>[] 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.WorkerThread.html#line.882">run</a>()</pre>
+<pre>public void <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> in interface <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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1351">allRegions</a></pre>
+<pre>private 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 <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> connection,
+<pre>public <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> 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>[] monitorTargets,
boolean useRegExp,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a> 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 <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1360">getSink</a>()</pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1368">run</a>()</pre>
+<pre>public void <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> in interface <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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1384">checkNoTableNames</a>()</pre>
+<pre>private boolean <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 void <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> rsAndRMap,
+<pre>private void <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> rsAndRMap,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionServerStdOutSink</a> 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 <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1467">filterRegionServerByName</a>()</pre>
+<pre>private <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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 <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1473">getAllRegionServerByName</a>()</pre>
+<pre>private <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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 <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> fullRsAndRMap)</pre>
+<pre>private <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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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><<a href="https://docs.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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> 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 <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><<a href="https://docs.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">hosts</a></pre>
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<a href="https://docs.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.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 <a href="https://docs.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 <a href="https://docs.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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1290">timeout</a></pre>
+<pre>private final 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 <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> connection,
+<pre>protected <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> 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>[] monitorTargets,
boolean useRegExp,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.StdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.StdOutSink</a> 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1309">run</a>()</pre>
+<pre>public void <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> in interface <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 <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.ZookeeperMonitor.html#line.1339">getSink</a>()</pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.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 <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a> <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> connection,
+<pre>public <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a> <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> connection,
int 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>[] 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 <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><<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><<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>>> <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> admin,
+<pre>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<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><<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>>> <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> admin,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> 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> 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> executor,
@@ -869,7 +869,7 @@ implements org.apache.hadoop.util.Tool</pre>
<ul class="blockList">
<li class="blockList">
<h4>sniff</h4>
-<pre>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<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><<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>>> <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> admin,
+<pre>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<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><<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>>> <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> admin,
<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> sink,
<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a> 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> executor,
@@ -889,7 +889,7 @@ implements org.apache.hadoop.util.Tool</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>main</h4>
-<pre>public static void <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>[] args)
+<pre>public static void <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>[] 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>[] args)</code> </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>[] args)</code> </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> s,
int minValue,
int maxValue)</code> </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> s,
long 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> </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> 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> 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> usageFooter)</code> </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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> 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 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>[] args)</code> </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 conf)</code> </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 org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser <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 boolean <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>[] args)
+<pre>private boolean <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>[] 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 org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine <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>[] args)
+<pre>protected org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine <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>[] 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.177">printUsage</a>()</pre>
+<pre>protected void <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 void <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> usageStr,
+<pre>protected void <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> 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> 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> 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.189">addOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option option)</pre>
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.199">addOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.194">addRequiredOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option option)</pre>
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.204">addRequiredOption</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.Option 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 void <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> opt,
+<pre>protected void <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> 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> 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 void <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> shortOpt,
+<pre>protected void <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> 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> 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> 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 void <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> opt,
+<pre>protected void <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> 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> 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 void <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> shortOpt,
+<pre>protected void <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> 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> 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> 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 void <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> opt,
+<pre>protected void <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> 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> 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 void <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> shortOpt,
+<pre>protected void <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> 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> 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> 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.227">getOptionAsInt</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine cmd,
+<pre>public int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.237">getOptionAsInt</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine 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> opt,
int 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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.235">getOptionAsLong</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine cmd,
+<pre>public long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.245">getOptionAsLong</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine 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> opt,
int 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 double <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.243">getOptionAsDouble</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine cmd,
+<pre>public double <a href="../../../../../src-html/org/apache/hadoop/hbase/util/AbstractHBaseTool.html#line.253">getOptionAsDouble</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine 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> opt,
double 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 long <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> s,
+<pre>public static long <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> s,
long minValue,
long 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 int <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> s,
+<pre>public static int <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> s,
int minValue,
int 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 void <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>[] args)</pre>
+<pre>protected void <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>[] 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 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><E> (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><T>, 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><T>)</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><T>)</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><T>)</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><T>)</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><E> (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><T>, 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>[] args)</code> </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> </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 cmd)</code> </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 cmd)</code> </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> option,
int minNumCols,
int maxNumCols)</code> </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> t)</code> </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 org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.71">LOG</a></pre>
+<pre>private static final 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 <a href="https://docs.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 <a href="https://docs.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 org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.75">tableName</a></pre>
+<pre>private 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 byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.78">families</a></pre>
+<pre>private 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 <a href="https://docs.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 <a href="https://docs.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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.84">DEFAULT_DATA_SIZE</a></pre>
+<pre>protected static final 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.87">DEFAULT_NUM_THREADS</a></pre>
+<pre>protected static final 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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.157">DEFAULT_NUM_REGIONS_PER_SERVER</a></pre>
+<pre>public static 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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.171">DEFAULT_START_KEY</a></pre>
+<pre>protected static final 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 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 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 <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 <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 <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 <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 <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 <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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.180">startKey</a></pre>
+<pre>protected 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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.180">endKey</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.182">isWrite</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.182">isRead</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.182">isUpdate</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.183">deferredLogFlush</a></pre>
+<pre>protected 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 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 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 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 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 org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.188">bloomType</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.189">inMemoryCF</a></pre>
+<pre>private 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 org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.191">userOwner</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.193">numWriterThreads</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.194">minColsPerKey</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.194">maxColsPerKey</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.195">minColDataSize</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.195">maxColDataSize</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.196">isMultiPut</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.199">numUpdaterThreads</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.200">updatePercent</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.201">ignoreConflicts</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.202">isBatchUpdate</a></pre>
+<pre>protected 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.205">numReaderThreads</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.206">keyWindow</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.207">multiGetBatchSize</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.208">maxReadErrors</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.209">verifyPercent</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.211">numTables</a></pre>
+<pre>private 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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 <a href="https://docs.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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.219">numRegionsPerServer</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.220">regionReplication</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.221">regionReplicaId</a></pre>
+<pre>private 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.223">mobThreshold</a></pre>
+<pre>private 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.227">isSkipInit</a></pre>
+<pre>protected 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.228">isInitOnly</a></pre>
+<pre>protected 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 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 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 <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><<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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.854">thrown</a></pre>
+<pre>protected <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><<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>> <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.69">LoadTestTool</a>()</pre>
+<pre>public <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 <a href="https://docs.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.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> option,
+<pre>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>[] <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> option,
int minNumCols,
int 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 int <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> numThreadsStr)</pre>
+<pre>protected int <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> 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 byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.249">getColumnFamilies</a>()</pre>
+<pre>public byte[][] <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.257">applyColumnFamilyOptions</a>(org.apache.hadoop.hbase.TableName tableName,
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.264">applyColumnFamilyOptions</a>(org.apache.hadoop.hbase.TableName tableName,
byte[][] 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.309">addOptions</a>()</pre>
+<pre>protected void <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> in class <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 org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser <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> in class <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.362">processOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine cmd)</pre>
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.403">processOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine cmd)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>processOptions</code> in class <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.507">parseColumnFamilyOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine cmd)</pre>
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.534">parseColumnFamilyOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.527">initTestTable</a>()
+<pre>public void <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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.540">doWork</a>()
+<pre>protected int <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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/util/LoadTestTool.html#line.548">loadTable</a>()
+<pre>protected int <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 <a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a> <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> clazzName)
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a> <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> 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 <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.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> clazzName,
+<pre>private <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.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> clazzName,
<a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a> 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 <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.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> clazzName,
+<pre>private <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.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> clazzName,
<a href="../../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.html" title="class in org.apache.hadoop.hbase.util.test">LoadTestDataGenerator</a> 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 <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.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 –
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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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> "<avg_cols_per_key>:<avg_data_size>" +<a name="line.91"></a>
-<span class="sourceLineNo">092</span> "[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<verify_percent>[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<update_percent>[:<#threads=" + DEFAULT_NUM_THREADS<a name="line.100"></a>
-<span class="sourceLineNo">101</span> + ">][:<#whether to ignore nonce collisions=0>]";<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> "<avg_cols_per_key>:<avg_data_size>" +<a name="line.98"></a>
+<span class="sourceLineNo">099</span> "[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<verify_percent>[:<#threads=" + DEFAULT_NUM_THREADS + ">]";<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> "<update_percent>[:<#threads=" + DEFAULT_NUM_THREADS<a name="line.107"></a>
+<span class="sourceLineNo">108</span> + ">][:<#whether to ignore nonce collisions=0>]";<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 < minNumCols || cols.length > 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 >= 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 < minNumCols || cols.length > 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 >= 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 <tn>_1...<tn>_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 <tn>_1...<tn>_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 < 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 && !isRead && !isUpdate && !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 && (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 && !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 && 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 && !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 < 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 < 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 < 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 < 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 < 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 < 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.857"></a>
-<span class="sourceLineNo">858</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.858"></a>
-<span class="sourceLineNo">859</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.935"></a>
-<span class="sourceLineNo">936</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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<Pair<RegionInfo, ServerName>> 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 < numberOfServers * regionsLowerLimit<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span> || numberOfRegions > 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<ServerName> serverSet = new HashSet<>();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span> for (Pair<RegionInfo, ServerName> 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 < 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<Future<Void>> 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<>();<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<Future<Void>> 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<>();<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<RegionTask> tasks = new ArrayList<>();<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<String> 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<ZookeeperTask> 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<Void> 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 <N> 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 <B> 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 <N> timeout for a check, default is 600000 (millisecs)");<a name="line.856"></a>
+<span class="sourceLineNo">857</span> System.err.println(" -writeTableTimeout <N> write timeout for the writeTable, default is 600000 (millisecs)");<a name="line.857"></a>
+<span class="sourceLineNo">858</span> System.err.println(" -readTableTimeouts <tableName>=<read timeout>,<tableName>=<read timeout>, ... "<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=<true/false> 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<configProperty>=<value> 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 >= 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 &&<a name="line.934"></a>
+<span class="sourceLineNo">935</span> (sink.getReadFailureCount() > 0 || sink.getWriteFailureCount() > 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<String, Long> 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<String, Long> 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<>(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<Future<Void>> taskFutures = new LinkedList<>();<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 && this.targets.length > 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<>(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 > 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<Void> 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<String, LongAdder> actualReadTableLatency = regionSink.getReadLatencyMap();<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span> for (Map.Entry<String, Long> 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 > 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 > 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<String> tmpTables = new TreeSet<>();<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() > 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<Future<Void>> 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<Future<Void>> taskFutures = new LinkedList<>();<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> && (!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>