<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
<span class="sourceLineNo">017</span> */<a name="line.17"></a>
<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.regionserver;<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_SPLIT_WAL_MAX_SPLITTER;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_COORDINATED_BY_ZK;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import static org.apache.hadoop.hbase.HConstants.HBASE_SPLIT_WAL_MAX_SPLITTER;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import static org.apache.hadoop.hbase.util.DNS.RS_HOSTNAME_KEY;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.lang.management.MemoryType;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.lang.management.MemoryUsage;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.lang.reflect.Constructor;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.net.BindException;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.net.InetAddress;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.net.InetSocketAddress;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.time.Duration;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.ArrayList;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.Collection;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.Collections;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import java.util.Comparator;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import java.util.HashSet;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import java.util.List;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import java.util.Map;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import java.util.Map.Entry;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import java.util.Objects;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import java.util.Optional;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import java.util.Set;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import java.util.SortedMap;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import java.util.Timer;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import java.util.TimerTask;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import java.util.TreeMap;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import java.util.TreeSet;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import java.util.concurrent.ConcurrentMap;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import java.util.concurrent.ConcurrentSkipListMap;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import java.util.concurrent.TimeUnit;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import java.util.concurrent.locks.ReentrantReadWriteLock;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import java.util.stream.Collectors;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import javax.management.MalformedObjectNameException;<a name="line.57"></a>
<span class="sourceLineNo">058</span>import javax.servlet.http.HttpServlet;<a name="line.58"></a>
<span class="sourceLineNo">059</span>import org.apache.commons.lang3.RandomUtils;<a name="line.59"></a>
<span class="sourceLineNo">060</span>import org.apache.commons.lang3.StringUtils;<a name="line.60"></a>
<span class="sourceLineNo">061</span>import org.apache.commons.lang3.SystemUtils;<a name="line.61"></a>
<span class="sourceLineNo">062</span>import org.apache.hadoop.conf.Configuration;<a name="line.62"></a>
<span class="sourceLineNo">063</span>import org.apache.hadoop.fs.FileSystem;<a name="line.63"></a>
<span class="sourceLineNo">064</span>import org.apache.hadoop.fs.Path;<a name="line.64"></a>
<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.Abortable;<a name="line.65"></a>
<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.CacheEvictionStats;<a name="line.66"></a>
<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.CallQueueTooBigException;<a name="line.67"></a>
<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.ChoreService;<a name="line.68"></a>
<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.ClockOutOfSyncException;<a name="line.69"></a>
<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.70"></a>
<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.71"></a>
<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.ExecutorStatusChore;<a name="line.72"></a>
<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.73"></a>
<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<a name="line.74"></a>
<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.HConstants;<a name="line.75"></a>
<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.HDFSBlocksDistribution;<a name="line.76"></a>
<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.HealthCheckChore;<a name="line.77"></a>
<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.78"></a>
<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.NotServingRegionException;<a name="line.79"></a>
<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.PleaseHoldException;<a name="line.80"></a>
<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.ScheduledChore;<a name="line.81"></a>
<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.ServerName;<a name="line.82"></a>
<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.Stoppable;<a name="line.83"></a>
<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.84"></a>
<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.TableName;<a name="line.85"></a>
<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.YouAreDeadException;<a name="line.86"></a>
<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.ZNodeClearer;<a name="line.87"></a>
<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.client.AsyncClusterConnection;<a name="line.88"></a>
<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.client.ClusterConnectionFactory;<a name="line.89"></a>
<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.90"></a>
<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.91"></a>
<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.client.ConnectionUtils;<a name="line.92"></a>
<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.93"></a>
<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.94"></a>
<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.client.locking.EntityLock;<a name="line.95"></a>
<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.client.locking.LockServiceClient;<a name="line.96"></a>
<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.conf.ConfigurationManager;<a name="line.97"></a>
<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.98"></a>
<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.coordination.ZkCoordinatedStateManager;<a name="line.99"></a>
<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.100"></a>
<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.101"></a>
<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.exceptions.RegionOpeningException;<a name="line.102"></a>
<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.exceptions.UnknownProtocolException;<a name="line.103"></a>
<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.executor.ExecutorService;<a name="line.104"></a>
<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.executor.ExecutorType;<a name="line.105"></a>
<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.fs.HFileSystem;<a name="line.106"></a>
<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.http.InfoServer;<a name="line.107"></a>
<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.108"></a>
<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.io.hfile.BlockCacheFactory;<a name="line.109"></a>
<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.110"></a>
<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.io.util.MemorySizeUtil;<a name="line.111"></a>
<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;<a name="line.112"></a>
<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.ipc.NettyRpcClientConfigHelper;<a name="line.113"></a>
<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.ipc.RpcClient;<a name="line.114"></a>
<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.ipc.RpcServer;<a name="line.115"></a>
<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.ipc.RpcServerInterface;<a name="line.116"></a>
<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;<a name="line.117"></a>
<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.ipc.ServerRpcController;<a name="line.118"></a>
<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.119"></a>
<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.120"></a>
<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.master.LoadBalancer;<a name="line.121"></a>
<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.master.MasterRpcServicesVersionWrapper;<a name="line.122"></a>
<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.123"></a>
<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer;<a name="line.124"></a>
<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.mob.MobFileCache;<a name="line.125"></a>
<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.namequeues.NamedQueueRecorder;<a name="line.126"></a>
<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.namequeues.SlowLogTableOpsChore;<a name="line.127"></a>
<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.procedure.RegionServerProcedureManagerHost;<a name="line.128"></a>
<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.procedure2.RSProcedureCallable;<a name="line.129"></a>
<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.quotas.FileSystemUtilizationChore;<a name="line.130"></a>
<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.131"></a>
<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.quotas.RegionServerRpcQuotaManager;<a name="line.132"></a>
<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.quotas.RegionServerSpaceQuotaManager;<a name="line.133"></a>
<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.quotas.RegionSize;<a name="line.134"></a>
<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.quotas.RegionSizeStore;<a name="line.135"></a>
<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration;<a name="line.136"></a>
<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.137"></a>
<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionProgress;<a name="line.138"></a>
<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester;<a name="line.139"></a>
<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.handler.CloseMetaHandler;<a name="line.140"></a>
<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler;<a name="line.141"></a>
<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.handler.RSProcedureHandler;<a name="line.142"></a>
<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.handler.RegionReplicaFlushHandler;<a name="line.143"></a>
<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.throttle.FlushThroughputControllerFactory;<a name="line.144"></a>
<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.throttle.ThroughputController;<a name="line.145"></a>
<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationLoad;<a name="line.146"></a>
<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceInterface;<a name="line.147"></a>
<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationStatus;<a name="line.148"></a>
<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.security.SecurityConstants;<a name="line.149"></a>
<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.150"></a>
<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.security.User;<a name="line.151"></a>
<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.152"></a>
<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.security.access.AccessChecker;<a name="line.153"></a>
<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.security.access.ZKPermissionWatcher;<a name="line.154"></a>
<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.155"></a>
<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.156"></a>
<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.157"></a>
<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.158"></a>
<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.159"></a>
<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.160"></a>
<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.161"></a>
<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.util.FSTableDescriptors;<a name="line.162"></a>
<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.163"></a>
<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.util.FutureUtils;<a name="line.164"></a>
<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.util.JvmPauseMonitor;<a name="line.165"></a>
<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig;<a name="line.166"></a>
<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.167"></a>
<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.168"></a>
<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.util.RetryCounterFactory;<a name="line.169"></a>
<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.170"></a>
<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.util.Sleeper;<a name="line.171"></a>
<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.172"></a>
<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.173"></a>
<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.174"></a>
<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.175"></a>
<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.176"></a>
<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.177"></a>
<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.178"></a>
<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.zookeeper.ClusterStatusTracker;<a name="line.179"></a>
<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.180"></a>
<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;<a name="line.181"></a>
<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.182"></a>
<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.zookeeper.ZKNodeTracker;<a name="line.183"></a>
<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.184"></a>
<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.185"></a>
<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.186"></a>
<span class="sourceLineNo">187</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.187"></a>
<span class="sourceLineNo">188</span>import org.apache.hadoop.util.ReflectionUtils;<a name="line.188"></a>
<span class="sourceLineNo">189</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.189"></a>
<span class="sourceLineNo">190</span>import org.apache.zookeeper.KeeperException;<a name="line.190"></a>
<span class="sourceLineNo">191</span>import org.slf4j.Logger;<a name="line.191"></a>
<span class="sourceLineNo">192</span>import org.slf4j.LoggerFactory;<a name="line.192"></a>
<span class="sourceLineNo">193</span>import sun.misc.Signal;<a name="line.193"></a>
<span class="sourceLineNo">194</span><a name="line.194"></a>
<span class="sourceLineNo">195</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.195"></a>
<span class="sourceLineNo">196</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.196"></a>
<span class="sourceLineNo">197</span>import org.apache.hbase.thirdparty.com.google.common.base.Throwables;<a name="line.197"></a>
<span class="sourceLineNo">198</span>import org.apache.hbase.thirdparty.com.google.common.cache.Cache;<a name="line.198"></a>
<span class="sourceLineNo">199</span>import org.apache.hbase.thirdparty.com.google.common.cache.CacheBuilder;<a name="line.199"></a>
<span class="sourceLineNo">200</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.200"></a>
<span class="sourceLineNo">201</span>import org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel;<a name="line.201"></a>
<span class="sourceLineNo">202</span>import org.apache.hbase.thirdparty.com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.202"></a>
<span class="sourceLineNo">203</span>import org.apache.hbase.thirdparty.com.google.protobuf.Descriptors.ServiceDescriptor;<a name="line.203"></a>
<span class="sourceLineNo">204</span>import org.apache.hbase.thirdparty.com.google.protobuf.Message;<a name="line.204"></a>
<span class="sourceLineNo">205</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcController;<a name="line.205"></a>
<span class="sourceLineNo">206</span>import org.apache.hbase.thirdparty.com.google.protobuf.Service;<a name="line.206"></a>
<span class="sourceLineNo">207</span>import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;<a name="line.207"></a>
<span class="sourceLineNo">208</span>import org.apache.hbase.thirdparty.com.google.protobuf.TextFormat;<a name="line.208"></a>
<span class="sourceLineNo">209</span>import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;<a name="line.209"></a>
<span class="sourceLineNo">210</span><a name="line.210"></a>
<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.211"></a>
<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;<a name="line.212"></a>
<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceCall;<a name="line.213"></a>
<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceRequest;<a name="line.214"></a>
<span class="sourceLineNo">215</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceResponse;<a name="line.215"></a>
<span class="sourceLineNo">216</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos;<a name="line.216"></a>
<span class="sourceLineNo">217</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionLoad;<a name="line.217"></a>
<span class="sourceLineNo">218</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.RegionStoreSequenceIds;<a name="line.218"></a>
<span class="sourceLineNo">219</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.UserLoad;<a name="line.219"></a>
<span class="sourceLineNo">220</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.Coprocessor;<a name="line.220"></a>
<span class="sourceLineNo">221</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.Coprocessor.Builder;<a name="line.221"></a>
<span class="sourceLineNo">222</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameStringPair;<a name="line.222"></a>
<span class="sourceLineNo">223</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionServerInfo;<a name="line.223"></a>
<span class="sourceLineNo">224</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier;<a name="line.224"></a>
<span class="sourceLineNo">225</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;<a name="line.225"></a>
<span class="sourceLineNo">226</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.LockServiceProtos.LockService;<a name="line.226"></a>
<span class="sourceLineNo">227</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos;<a name="line.227"></a>
<span class="sourceLineNo">228</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.GetLastFlushedSequenceIdRequest;<a name="line.228"></a>
<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.GetLastFlushedSequenceIdResponse;<a name="line.229"></a>
<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerReportRequest;<a name="line.230"></a>
<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupRequest;<a name="line.231"></a>
<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStartupResponse;<a name="line.232"></a>
<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionServerStatusService;<a name="line.233"></a>
<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUse;<a name="line.234"></a>
<span class="sourceLineNo">235</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionSpaceUseReportRequest;<a name="line.235"></a>
<span class="sourceLineNo">236</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition;<a name="line.236"></a>
<span class="sourceLineNo">237</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode;<a name="line.237"></a>
<span class="sourceLineNo">238</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportProcedureDoneRequest;<a name="line.238"></a>
<span class="sourceLineNo">239</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRSFatalErrorRequest;<a name="line.239"></a>
<span class="sourceLineNo">240</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest;<a name="line.240"></a>
<span class="sourceLineNo">241</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse;<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> * HRegionServer makes a set of HRegions available to clients. It checks in with<a name="line.244"></a>
<span class="sourceLineNo">245</span> * the HMaster. There are many HRegionServers in a single HBase deployment.<a name="line.245"></a>
<span class="sourceLineNo">246</span> */<a name="line.246"></a>
<span class="sourceLineNo">247</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.247"></a>
<span class="sourceLineNo">248</span>@SuppressWarnings({ "deprecation"})<a name="line.248"></a>
<span class="sourceLineNo">249</span>public class HRegionServer extends Thread implements<a name="line.249"></a>
<span class="sourceLineNo">250</span>    RegionServerServices, LastSequenceId, ConfigurationObserver {<a name="line.250"></a>
<span class="sourceLineNo">251</span>  private static final Logger LOG = LoggerFactory.getLogger(HRegionServer.class);<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>   * For testing only!  Set to true to skip notifying region assignment to master .<a name="line.254"></a>
<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
<span class="sourceLineNo">256</span>  @VisibleForTesting<a name="line.256"></a>
<span class="sourceLineNo">257</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="MS_SHOULD_BE_FINAL")<a name="line.257"></a>
<span class="sourceLineNo">258</span>  public static boolean TEST_SKIP_REPORTING_TRANSITION = false;<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 map from RegionName to current action in progress. Boolean value indicates:<a name="line.261"></a>
<span class="sourceLineNo">262</span>   * true - if open region action in progress<a name="line.262"></a>
<span class="sourceLineNo">263</span>   * false - if close region action in progress<a name="line.263"></a>
<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
<span class="sourceLineNo">265</span>  private final ConcurrentMap&lt;byte[], Boolean&gt; regionsInTransitionInRS =<a name="line.265"></a>
<span class="sourceLineNo">266</span>    new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.266"></a>
<span class="sourceLineNo">267</span><a name="line.267"></a>
<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
<span class="sourceLineNo">269</span>   * Used to cache the open/close region procedures which already submitted.<a name="line.269"></a>
<span class="sourceLineNo">270</span>   * See {@link #submitRegionProcedure(long)}.<a name="line.270"></a>
<span class="sourceLineNo">271</span>   */<a name="line.271"></a>
<span class="sourceLineNo">272</span>  private final ConcurrentMap&lt;Long, Long&gt; submittedRegionProcedures = new ConcurrentHashMap&lt;&gt;();<a name="line.272"></a>
<span class="sourceLineNo">273</span>  /**<a name="line.273"></a>
<span class="sourceLineNo">274</span>   * Used to cache the open/close region procedures which already executed.<a name="line.274"></a>
<span class="sourceLineNo">275</span>   * See {@link #submitRegionProcedure(long)}.<a name="line.275"></a>
<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
<span class="sourceLineNo">277</span>  private final Cache&lt;Long, Long&gt; executedRegionProcedures =<a name="line.277"></a>
<span class="sourceLineNo">278</span>      CacheBuilder.newBuilder().expireAfterAccess(600, TimeUnit.SECONDS).build();<a name="line.278"></a>
<span class="sourceLineNo">279</span><a name="line.279"></a>
<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
<span class="sourceLineNo">281</span>   * Used to cache the moved-out regions<a name="line.281"></a>
<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
<span class="sourceLineNo">283</span>  private final Cache&lt;String, MovedRegionInfo&gt; movedRegionInfoCache =<a name="line.283"></a>
<span class="sourceLineNo">284</span>      CacheBuilder.newBuilder().expireAfterWrite(movedRegionCacheExpiredTime(),<a name="line.284"></a>
<span class="sourceLineNo">285</span>        TimeUnit.MILLISECONDS).build();<a name="line.285"></a>
<span class="sourceLineNo">286</span><a name="line.286"></a>
<span class="sourceLineNo">287</span>  private MemStoreFlusher cacheFlusher;<a name="line.287"></a>
<span class="sourceLineNo">288</span><a name="line.288"></a>
<span class="sourceLineNo">289</span>  private HeapMemoryManager hMemManager;<a name="line.289"></a>
<span class="sourceLineNo">290</span><a name="line.290"></a>
<span class="sourceLineNo">291</span>  /**<a name="line.291"></a>
<span class="sourceLineNo">292</span>   * The asynchronous cluster connection to be shared by services.<a name="line.292"></a>
<span class="sourceLineNo">293</span>   */<a name="line.293"></a>
<span class="sourceLineNo">294</span>  protected AsyncClusterConnection asyncClusterConnection;<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>   * Go here to get table descriptors.<a name="line.297"></a>
<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
<span class="sourceLineNo">299</span>  protected TableDescriptors tableDescriptors;<a name="line.299"></a>
<span class="sourceLineNo">300</span><a name="line.300"></a>
<span class="sourceLineNo">301</span>  // Replication services. If no replication, this handler will be null.<a name="line.301"></a>
<span class="sourceLineNo">302</span>  private ReplicationSourceService replicationSourceHandler;<a name="line.302"></a>
<span class="sourceLineNo">303</span>  private ReplicationSinkService replicationSinkHandler;<a name="line.303"></a>
<span class="sourceLineNo">304</span>  private boolean sameReplicationSourceAndSink;<a name="line.304"></a>
<span class="sourceLineNo">305</span><a name="line.305"></a>
<span class="sourceLineNo">306</span>  // Compactions<a name="line.306"></a>
<span class="sourceLineNo">307</span>  public CompactSplit compactSplitThread;<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>   * Map of regions currently being served by this region server. Key is the<a name="line.310"></a>
<span class="sourceLineNo">311</span>   * encoded region name.  All access should be synchronized.<a name="line.311"></a>
<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
<span class="sourceLineNo">313</span>  private final Map&lt;String, HRegion&gt; onlineRegions = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
<span class="sourceLineNo">315</span>   * Lock for gating access to {@link #onlineRegions}.<a name="line.315"></a>
<span class="sourceLineNo">316</span>   * TODO: If this map is gated by a lock, does it need to be a ConcurrentHashMap?<a name="line.316"></a>
<span class="sourceLineNo">317</span>   */<a name="line.317"></a>
<span class="sourceLineNo">318</span>  private final ReentrantReadWriteLock onlineRegionsLock = new ReentrantReadWriteLock();<a name="line.318"></a>
<span class="sourceLineNo">319</span><a name="line.319"></a>
<span class="sourceLineNo">320</span>  /**<a name="line.320"></a>
<span class="sourceLineNo">321</span>   * Map of encoded region names to the DataNode locations they should be hosted on<a name="line.321"></a>
<span class="sourceLineNo">322</span>   * We store the value as InetSocketAddress since this is used only in HDFS<a name="line.322"></a>
<span class="sourceLineNo">323</span>   * API (create() that takes favored nodes as hints for placing file blocks).<a name="line.323"></a>
<span class="sourceLineNo">324</span>   * We could have used ServerName here as the value class, but we'd need to<a name="line.324"></a>
<span class="sourceLineNo">325</span>   * convert it to InetSocketAddress at some point before the HDFS API call, and<a name="line.325"></a>
<span class="sourceLineNo">326</span>   * it seems a bit weird to store ServerName since ServerName refers to RegionServers<a name="line.326"></a>
<span class="sourceLineNo">327</span>   * and here we really mean DataNode locations.<a name="line.327"></a>
<span class="sourceLineNo">328</span>   */<a name="line.328"></a>
<span class="sourceLineNo">329</span>  private final Map&lt;String, InetSocketAddress[]&gt; regionFavoredNodesMap = new ConcurrentHashMap&lt;&gt;();<a name="line.329"></a>
<span class="sourceLineNo">330</span><a name="line.330"></a>
<span class="sourceLineNo">331</span>  private LeaseManager leaseManager;<a name="line.331"></a>
<span class="sourceLineNo">332</span><a name="line.332"></a>
<span class="sourceLineNo">333</span>  // Instance of the hbase executor executorService.<a name="line.333"></a>
<span class="sourceLineNo">334</span>  protected ExecutorService executorService;<a name="line.334"></a>
<span class="sourceLineNo">335</span><a name="line.335"></a>
<span class="sourceLineNo">336</span>  private volatile boolean dataFsOk;<a name="line.336"></a>
<span class="sourceLineNo">337</span>  private HFileSystem dataFs;<a name="line.337"></a>
<span class="sourceLineNo">338</span>  private HFileSystem walFs;<a name="line.338"></a>
<span class="sourceLineNo">339</span><a name="line.339"></a>
<span class="sourceLineNo">340</span>  // Set when a report to the master comes back with a message asking us to<a name="line.340"></a>
<span class="sourceLineNo">341</span>  // shutdown. Also set by call to stop when debugging or running unit tests<a name="line.341"></a>
<span class="sourceLineNo">342</span>  // of HRegionServer in isolation.<a name="line.342"></a>
<span class="sourceLineNo">343</span>  private volatile boolean stopped = false;<a name="line.343"></a>
<span class="sourceLineNo">344</span><a name="line.344"></a>
<span class="sourceLineNo">345</span>  // Go down hard. Used if file system becomes unavailable and also in<a name="line.345"></a>
<span class="sourceLineNo">346</span>  // debugging and unit tests.<a name="line.346"></a>
<span class="sourceLineNo">347</span>  private AtomicBoolean abortRequested;<a name="line.347"></a>
<span class="sourceLineNo">348</span>  static final String ABORT_TIMEOUT = "hbase.regionserver.abort.timeout";<a name="line.348"></a>
<span class="sourceLineNo">349</span>  // Default abort timeout is 1200 seconds for safe<a name="line.349"></a>
<span class="sourceLineNo">350</span>  private static final long DEFAULT_ABORT_TIMEOUT = 1200000;<a name="line.350"></a>
<span class="sourceLineNo">351</span>  // Will run this task when abort timeout<a name="line.351"></a>
<span class="sourceLineNo">352</span>  static final String ABORT_TIMEOUT_TASK = "hbase.regionserver.abort.timeout.task";<a name="line.352"></a>
<span class="sourceLineNo">353</span><a name="line.353"></a>
<span class="sourceLineNo">354</span>  // A state before we go into stopped state.  At this stage we're closing user<a name="line.354"></a>
<span class="sourceLineNo">355</span>  // space regions.<a name="line.355"></a>
<span class="sourceLineNo">356</span>  private boolean stopping = false;<a name="line.356"></a>
<span class="sourceLineNo">357</span>  private volatile boolean killed = false;<a name="line.357"></a>
<span class="sourceLineNo">358</span>  private volatile boolean shutDown = false;<a name="line.358"></a>
<span class="sourceLineNo">359</span><a name="line.359"></a>
<span class="sourceLineNo">360</span>  protected final Configuration conf;<a name="line.360"></a>
<span class="sourceLineNo">361</span><a name="line.361"></a>
<span class="sourceLineNo">362</span>  private Path dataRootDir;<a name="line.362"></a>
<span class="sourceLineNo">363</span>  private Path walRootDir;<a name="line.363"></a>
<span class="sourceLineNo">364</span><a name="line.364"></a>
<span class="sourceLineNo">365</span>  private final int threadWakeFrequency;<a name="line.365"></a>
<span class="sourceLineNo">366</span>  final int msgInterval;<a name="line.366"></a>
<span class="sourceLineNo">367</span><a name="line.367"></a>
<span class="sourceLineNo">368</span>  private static final String PERIOD_COMPACTION = "hbase.regionserver.compaction.check.period";<a name="line.368"></a>
<span class="sourceLineNo">369</span>  private final int compactionCheckFrequency;<a name="line.369"></a>
<span class="sourceLineNo">370</span>  private static final String PERIOD_FLUSH = "hbase.regionserver.flush.check.period";<a name="line.370"></a>
<span class="sourceLineNo">371</span>  private final int flushCheckFrequency;<a name="line.371"></a>
<span class="sourceLineNo">372</span><a name="line.372"></a>
<span class="sourceLineNo">373</span>  // Stub to do region server status calls against the master.<a name="line.373"></a>
<span class="sourceLineNo">374</span>  private volatile RegionServerStatusService.BlockingInterface rssStub;<a name="line.374"></a>
<span class="sourceLineNo">375</span>  private volatile LockService.BlockingInterface lockStub;<a name="line.375"></a>
<span class="sourceLineNo">376</span>  // RPC client. Used to make the stub above that does region server status checking.<a name="line.376"></a>
<span class="sourceLineNo">377</span>  private RpcClient rpcClient;<a name="line.377"></a>
<span class="sourceLineNo">378</span><a name="line.378"></a>
<span class="sourceLineNo">379</span>  private UncaughtExceptionHandler uncaughtExceptionHandler;<a name="line.379"></a>
<span class="sourceLineNo">380</span><a name="line.380"></a>
<span class="sourceLineNo">381</span>  // Info server. Default access so can be used by unit tests. REGIONSERVER<a name="line.381"></a>
<span class="sourceLineNo">382</span>  // is name of the webapp and the attribute name used stuffing this instance<a name="line.382"></a>
<span class="sourceLineNo">383</span>  // into web context.<a name="line.383"></a>
<span class="sourceLineNo">384</span>  protected InfoServer infoServer;<a name="line.384"></a>
<span class="sourceLineNo">385</span>  private JvmPauseMonitor pauseMonitor;<a name="line.385"></a>
<span class="sourceLineNo">386</span><a name="line.386"></a>
<span class="sourceLineNo">387</span>  /** region server process name */<a name="line.387"></a>
<span class="sourceLineNo">388</span>  public static final String REGIONSERVER = "regionserver";<a name="line.388"></a>
<span class="sourceLineNo">389</span><a name="line.389"></a>
<span class="sourceLineNo">390</span><a name="line.390"></a>
<span class="sourceLineNo">391</span>  private MetricsRegionServer metricsRegionServer;<a name="line.391"></a>
<span class="sourceLineNo">392</span>  MetricsRegionServerWrapperImpl metricsRegionServerImpl;<a name="line.392"></a>
<span class="sourceLineNo">393</span>  private SpanReceiverHost spanReceiverHost;<a name="line.393"></a>
<span class="sourceLineNo">394</span><a name="line.394"></a>
<span class="sourceLineNo">395</span>  /**<a name="line.395"></a>
<span class="sourceLineNo">396</span>   * ChoreService used to schedule tasks that we want to run periodically<a name="line.396"></a>
<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
<span class="sourceLineNo">398</span>  private ChoreService choreService;<a name="line.398"></a>
<span class="sourceLineNo">399</span><a name="line.399"></a>
<span class="sourceLineNo">400</span>  /**<a name="line.400"></a>
<span class="sourceLineNo">401</span>   * Check for compactions requests.<a name="line.401"></a>
<span class="sourceLineNo">402</span>   */<a name="line.402"></a>
<span class="sourceLineNo">403</span>  private ScheduledChore compactionChecker;<a name="line.403"></a>
<span class="sourceLineNo">404</span><a name="line.404"></a>
<span class="sourceLineNo">405</span>  /**<a name="line.405"></a>
<span class="sourceLineNo">406</span>   * Check for flushes<a name="line.406"></a>
<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
<span class="sourceLineNo">408</span>  private ScheduledChore periodicFlusher;<a name="line.408"></a>
<span class="sourceLineNo">409</span><a name="line.409"></a>
<span class="sourceLineNo">410</span>  private volatile WALFactory walFactory;<a name="line.410"></a>
<span class="sourceLineNo">411</span><a name="line.411"></a>
<span class="sourceLineNo">412</span>  private LogRoller walRoller;<a name="line.412"></a>
<span class="sourceLineNo">413</span><a name="line.413"></a>
<span class="sourceLineNo">414</span>  // A thread which calls reportProcedureDone<a name="line.414"></a>
<span class="sourceLineNo">415</span>  private RemoteProcedureResultReporter procedureResultReporter;<a name="line.415"></a>
<span class="sourceLineNo">416</span><a name="line.416"></a>
<span class="sourceLineNo">417</span>  // flag set after we're done setting up server threads<a name="line.417"></a>
<span class="sourceLineNo">418</span>  final AtomicBoolean online = new AtomicBoolean(false);<a name="line.418"></a>
<span class="sourceLineNo">419</span><a name="line.419"></a>
<span class="sourceLineNo">420</span>  // zookeeper connection and watcher<a name="line.420"></a>
<span class="sourceLineNo">421</span>  protected final ZKWatcher zooKeeper;<a name="line.421"></a>
<span class="sourceLineNo">422</span><a name="line.422"></a>
<span class="sourceLineNo">423</span>  // master address tracker<a name="line.423"></a>
<span class="sourceLineNo">424</span>  private final MasterAddressTracker masterAddressTracker;<a name="line.424"></a>
<span class="sourceLineNo">425</span><a name="line.425"></a>
<span class="sourceLineNo">426</span>  // Cluster Status Tracker<a name="line.426"></a>
<span class="sourceLineNo">427</span>  protected final ClusterStatusTracker clusterStatusTracker;<a name="line.427"></a>
<span class="sourceLineNo">428</span><a name="line.428"></a>
<span class="sourceLineNo">429</span>  // Log Splitting Worker<a name="line.429"></a>
<span class="sourceLineNo">430</span>  private SplitLogWorker splitLogWorker;<a name="line.430"></a>
<span class="sourceLineNo">431</span><a name="line.431"></a>
<span class="sourceLineNo">432</span>  // A sleeper that sleeps for msgInterval.<a name="line.432"></a>
<span class="sourceLineNo">433</span>  protected final Sleeper sleeper;<a name="line.433"></a>
<span class="sourceLineNo">434</span><a name="line.434"></a>
<span class="sourceLineNo">435</span>  private final int shortOperationTimeout;<a name="line.435"></a>
<span class="sourceLineNo">436</span><a name="line.436"></a>
<span class="sourceLineNo">437</span>  private final RegionServerAccounting regionServerAccounting;<a name="line.437"></a>
<span class="sourceLineNo">438</span><a name="line.438"></a>
<span class="sourceLineNo">439</span>  private SlowLogTableOpsChore slowLogTableOpsChore = null;<a name="line.439"></a>
<span class="sourceLineNo">440</span><a name="line.440"></a>
<span class="sourceLineNo">441</span>  // Block cache<a name="line.441"></a>
<span class="sourceLineNo">442</span>  private BlockCache blockCache;<a name="line.442"></a>
<span class="sourceLineNo">443</span>  // The cache for mob files<a name="line.443"></a>
<span class="sourceLineNo">444</span>  private MobFileCache mobFileCache;<a name="line.444"></a>
<span class="sourceLineNo">445</span><a name="line.445"></a>
<span class="sourceLineNo">446</span>  /** The health check chore. */<a name="line.446"></a>
<span class="sourceLineNo">447</span>  private HealthCheckChore healthCheckChore;<a name="line.447"></a>
<span class="sourceLineNo">448</span><a name="line.448"></a>
<span class="sourceLineNo">449</span>  /** The Executor status collect chore. */<a name="line.449"></a>
<span class="sourceLineNo">450</span>  private ExecutorStatusChore executorStatusChore;<a name="line.450"></a>
<span class="sourceLineNo">451</span><a name="line.451"></a>
<span class="sourceLineNo">452</span>  /** The nonce manager chore. */<a name="line.452"></a>
<span class="sourceLineNo">453</span>  private ScheduledChore nonceManagerChore;<a name="line.453"></a>
<span class="sourceLineNo">454</span><a name="line.454"></a>
<span class="sourceLineNo">455</span>  private Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<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>   * The server name the Master sees us as.  Its made from the hostname the<a name="line.458"></a>
<span class="sourceLineNo">459</span>   * master passes us, port, and server startcode. Gets set after registration<a name="line.459"></a>
<span class="sourceLineNo">460</span>   * against Master.<a name="line.460"></a>
<span class="sourceLineNo">461</span>   */<a name="line.461"></a>
<span class="sourceLineNo">462</span>  protected ServerName serverName;<a name="line.462"></a>
<span class="sourceLineNo">463</span><a name="line.463"></a>
<span class="sourceLineNo">464</span>  /**<a name="line.464"></a>
<span class="sourceLineNo">465</span>   * hostname specified by hostname config<a name="line.465"></a>
<span class="sourceLineNo">466</span>   */<a name="line.466"></a>
<span class="sourceLineNo">467</span>  protected String useThisHostnameInstead;<a name="line.467"></a>
<span class="sourceLineNo">468</span><a name="line.468"></a>
<span class="sourceLineNo">469</span>  /**<a name="line.469"></a>
<span class="sourceLineNo">470</span>   * HBASE-18226: This config and hbase.regionserver.hostname are mutually exclusive.<a name="line.470"></a>
<span class="sourceLineNo">471</span>   * Exception will be thrown if both are used.<a name="line.471"></a>
<span class="sourceLineNo">472</span>   */<a name="line.472"></a>
<span class="sourceLineNo">473</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.473"></a>
<span class="sourceLineNo">474</span>  final static String RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY =<a name="line.474"></a>
<span class="sourceLineNo">475</span>    "hbase.regionserver.hostname.disable.master.reversedns";<a name="line.475"></a>
<span class="sourceLineNo">476</span><a name="line.476"></a>
<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
<span class="sourceLineNo">478</span>   * This servers startcode.<a name="line.478"></a>
<span class="sourceLineNo">479</span>   */<a name="line.479"></a>
<span class="sourceLineNo">480</span>  protected final long startcode;<a name="line.480"></a>
<span class="sourceLineNo">481</span><a name="line.481"></a>
<span class="sourceLineNo">482</span>  /**<a name="line.482"></a>
<span class="sourceLineNo">483</span>   * Unique identifier for the cluster we are a part of.<a name="line.483"></a>
<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
<span class="sourceLineNo">485</span>  protected String clusterId;<a name="line.485"></a>
<span class="sourceLineNo">486</span><a name="line.486"></a>
<span class="sourceLineNo">487</span>  // chore for refreshing store files for secondary regions<a name="line.487"></a>
<span class="sourceLineNo">488</span>  private StorefileRefresherChore storefileRefresher;<a name="line.488"></a>
<span class="sourceLineNo">489</span><a name="line.489"></a>
<span class="sourceLineNo">490</span>  private RegionServerCoprocessorHost rsHost;<a name="line.490"></a>
<span class="sourceLineNo">491</span><a name="line.491"></a>
<span class="sourceLineNo">492</span>  private RegionServerProcedureManagerHost rspmHost;<a name="line.492"></a>
<span class="sourceLineNo">493</span><a name="line.493"></a>
<span class="sourceLineNo">494</span>  private RegionServerRpcQuotaManager rsQuotaManager;<a name="line.494"></a>
<span class="sourceLineNo">495</span>  private RegionServerSpaceQuotaManager rsSpaceQuotaManager;<a name="line.495"></a>
<span class="sourceLineNo">496</span><a name="line.496"></a>
<span class="sourceLineNo">497</span>  /**<a name="line.497"></a>
<span class="sourceLineNo">498</span>   * Nonce manager. Nonces are used to make operations like increment and append idempotent<a name="line.498"></a>
<span class="sourceLineNo">499</span>   * in the case where client doesn't receive the response from a successful operation and<a name="line.499"></a>
<span class="sourceLineNo">500</span>   * retries. We track the successful ops for some time via a nonce sent by client and handle<a name="line.500"></a>
<span class="sourceLineNo">501</span>   * duplicate operations (currently, by failing them; in future we might use MVCC to return<a name="line.501"></a>
<span class="sourceLineNo">502</span>   * result). Nonces are also recovered from WAL during, recovery; however, the caveats (from<a name="line.502"></a>
<span class="sourceLineNo">503</span>   * HBASE-3787) are:<a name="line.503"></a>
<span class="sourceLineNo">504</span>   * - WAL recovery is optimized, and under high load we won't read nearly nonce-timeout worth<a name="line.504"></a>
<span class="sourceLineNo">505</span>   *   of past records. If we don't read the records, we don't read and recover the nonces.<a name="line.505"></a>
<span class="sourceLineNo">506</span>   *   Some WALs within nonce-timeout at recovery may not even be present due to rolling/cleanup.<a name="line.506"></a>
<span class="sourceLineNo">507</span>   * - There's no WAL recovery during normal region move, so nonces will not be transfered.<a name="line.507"></a>
<span class="sourceLineNo">508</span>   * We can have separate additional "Nonce WAL". It will just contain bunch of numbers and<a name="line.508"></a>
<span class="sourceLineNo">509</span>   * won't be flushed on main path - because WAL itself also contains nonces, if we only flush<a name="line.509"></a>
<span class="sourceLineNo">510</span>   * it before memstore flush, for a given nonce we will either see it in the WAL (if it was<a name="line.510"></a>
<span class="sourceLineNo">511</span>   * never flushed to disk, it will be part of recovery), or we'll see it as part of the nonce<a name="line.511"></a>
<span class="sourceLineNo">512</span>   * log (or both occasionally, which doesn't matter). Nonce log file can be deleted after the<a name="line.512"></a>
<span class="sourceLineNo">513</span>   * latest nonce in it expired. It can also be recovered during move.<a name="line.513"></a>
<span class="sourceLineNo">514</span>   */<a name="line.514"></a>
<span class="sourceLineNo">515</span>  final ServerNonceManager nonceManager;<a name="line.515"></a>
<span class="sourceLineNo">516</span><a name="line.516"></a>
<span class="sourceLineNo">517</span>  private UserProvider userProvider;<a name="line.517"></a>
<span class="sourceLineNo">518</span><a name="line.518"></a>
<span class="sourceLineNo">519</span>  protected final RSRpcServices rpcServices;<a name="line.519"></a>
<span class="sourceLineNo">520</span><a name="line.520"></a>
<span class="sourceLineNo">521</span>  private CoordinatedStateManager csm;<a name="line.521"></a>
<span class="sourceLineNo">522</span><a name="line.522"></a>
<span class="sourceLineNo">523</span>  /**<a name="line.523"></a>
<span class="sourceLineNo">524</span>   * Configuration manager is used to register/deregister and notify the configuration observers<a name="line.524"></a>
<span class="sourceLineNo">525</span>   * when the regionserver is notified that there was a change in the on disk configs.<a name="line.525"></a>
<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
<span class="sourceLineNo">527</span>  protected final ConfigurationManager configurationManager;<a name="line.527"></a>
<span class="sourceLineNo">528</span><a name="line.528"></a>
<span class="sourceLineNo">529</span>  @VisibleForTesting<a name="line.529"></a>
<span class="sourceLineNo">530</span>  CompactedHFilesDischarger compactedFileDischarger;<a name="line.530"></a>
<span class="sourceLineNo">531</span><a name="line.531"></a>
<span class="sourceLineNo">532</span>  private volatile ThroughputController flushThroughputController;<a name="line.532"></a>
<span class="sourceLineNo">533</span><a name="line.533"></a>
<span class="sourceLineNo">534</span>  private SecureBulkLoadManager secureBulkLoadManager;<a name="line.534"></a>
<span class="sourceLineNo">535</span><a name="line.535"></a>
<span class="sourceLineNo">536</span>  private FileSystemUtilizationChore fsUtilizationChore;<a name="line.536"></a>
<span class="sourceLineNo">537</span><a name="line.537"></a>
<span class="sourceLineNo">538</span>  private final NettyEventLoopGroupConfig eventLoopGroupConfig;<a name="line.538"></a>
<span class="sourceLineNo">539</span><a name="line.539"></a>
<span class="sourceLineNo">540</span>  /**<a name="line.540"></a>
<span class="sourceLineNo">541</span>   * Provide online slow log responses from ringbuffer<a name="line.541"></a>
<span class="sourceLineNo">542</span>   */<a name="line.542"></a>
<span class="sourceLineNo">543</span>  private NamedQueueRecorder namedQueueRecorder = null;<a name="line.543"></a>
<span class="sourceLineNo">544</span><a name="line.544"></a>
<span class="sourceLineNo">545</span>  /**<a name="line.545"></a>
<span class="sourceLineNo">546</span>   * True if this RegionServer is coming up in a cluster where there is no Master;<a name="line.546"></a>
<span class="sourceLineNo">547</span>   * means it needs to just come up and make do without a Master to talk to: e.g. in test or<a name="line.547"></a>
<span class="sourceLineNo">548</span>   * HRegionServer is doing other than its usual duties: e.g. as an hollowed-out host whose only<a name="line.548"></a>
<span class="sourceLineNo">549</span>   * purpose is as a Replication-stream sink; see HBASE-18846 for more.<a name="line.549"></a>
<span class="sourceLineNo">550</span>   * TODO: can this replace {@link #TEST_SKIP_REPORTING_TRANSITION} ?<a name="line.550"></a>
<span class="sourceLineNo">551</span>   */<a name="line.551"></a>
<span class="sourceLineNo">552</span>  private final boolean masterless;<a name="line.552"></a>
<span class="sourceLineNo">553</span>  private static final String MASTERLESS_CONFIG_NAME = "hbase.masterless";<a name="line.553"></a>
<span class="sourceLineNo">554</span><a name="line.554"></a>
<span class="sourceLineNo">555</span>  /**regionserver codec list **/<a name="line.555"></a>
<span class="sourceLineNo">556</span>  private static final String REGIONSERVER_CODEC = "hbase.regionserver.codecs";<a name="line.556"></a>
<span class="sourceLineNo">557</span><a name="line.557"></a>
<span class="sourceLineNo">558</span>  // A timer to shutdown the process if abort takes too long<a name="line.558"></a>
<span class="sourceLineNo">559</span>  private Timer abortMonitor;<a name="line.559"></a>
<span class="sourceLineNo">560</span><a name="line.560"></a>
<span class="sourceLineNo">561</span>  /**<a name="line.561"></a>
<span class="sourceLineNo">562</span>   * Starts a HRegionServer at the default location.<a name="line.562"></a>
<span class="sourceLineNo">563</span>   * &lt;p/&gt;<a name="line.563"></a>
<span class="sourceLineNo">564</span>   * Don't start any services or managers in here in the Constructor.<a name="line.564"></a>
<span class="sourceLineNo">565</span>   * Defer till after we register with the Master as much as possible. See {@link #startServices}.<a name="line.565"></a>
<span class="sourceLineNo">566</span>   */<a name="line.566"></a>
<span class="sourceLineNo">567</span>  public HRegionServer(final Configuration conf) throws IOException {<a name="line.567"></a>
<span class="sourceLineNo">568</span>    super("RegionServer");  // thread name<a name="line.568"></a>
<span class="sourceLineNo">569</span>    TraceUtil.initTracer(conf);<a name="line.569"></a>
<span class="sourceLineNo">570</span>    try {<a name="line.570"></a>
<span class="sourceLineNo">571</span>      this.startcode = System.currentTimeMillis();<a name="line.571"></a>
<span class="sourceLineNo">572</span>      this.conf = conf;<a name="line.572"></a>
<span class="sourceLineNo">573</span>      this.dataFsOk = true;<a name="line.573"></a>
<span class="sourceLineNo">574</span>      this.masterless = conf.getBoolean(MASTERLESS_CONFIG_NAME, false);<a name="line.574"></a>
<span class="sourceLineNo">575</span>      this.eventLoopGroupConfig = setupNetty(this.conf);<a name="line.575"></a>
<span class="sourceLineNo">576</span>      MemorySizeUtil.checkForClusterFreeHeapMemoryLimit(this.conf);<a name="line.576"></a>
<span class="sourceLineNo">577</span>      HFile.checkHFileVersion(this.conf);<a name="line.577"></a>
<span class="sourceLineNo">578</span>      checkCodecs(this.conf);<a name="line.578"></a>
<span class="sourceLineNo">579</span>      this.userProvider = UserProvider.instantiate(conf);<a name="line.579"></a>
<span class="sourceLineNo">580</span>      FSUtils.setupShortCircuitRead(this.conf);<a name="line.580"></a>
<span class="sourceLineNo">581</span><a name="line.581"></a>
<span class="sourceLineNo">582</span>      // Disable usage of meta replicas in the regionserver<a name="line.582"></a>
<span class="sourceLineNo">583</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.583"></a>
<span class="sourceLineNo">584</span>      // Config'ed params<a name="line.584"></a>
<span class="sourceLineNo">585</span>      this.threadWakeFrequency = conf.getInt(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.585"></a>
<span class="sourceLineNo">586</span>      this.compactionCheckFrequency = conf.getInt(PERIOD_COMPACTION, this.threadWakeFrequency);<a name="line.586"></a>
<span class="sourceLineNo">587</span>      this.flushCheckFrequency = conf.getInt(PERIOD_FLUSH, this.threadWakeFrequency);<a name="line.587"></a>
<span class="sourceLineNo">588</span>      this.msgInterval = conf.getInt("hbase.regionserver.msginterval", 3 * 1000);<a name="line.588"></a>
<span class="sourceLineNo">589</span><a name="line.589"></a>
<span class="sourceLineNo">590</span>      this.sleeper = new Sleeper(this.msgInterval, this);<a name="line.590"></a>
<span class="sourceLineNo">591</span><a name="line.591"></a>
<span class="sourceLineNo">592</span>      boolean isNoncesEnabled = conf.getBoolean(HConstants.HBASE_RS_NONCES_ENABLED, true);<a name="line.592"></a>
<span class="sourceLineNo">593</span>      this.nonceManager = isNoncesEnabled ? new ServerNonceManager(this.conf) : null;<a name="line.593"></a>
<span class="sourceLineNo">594</span><a name="line.594"></a>
<span class="sourceLineNo">595</span>      this.shortOperationTimeout = conf.getInt(HConstants.HBASE_RPC_SHORTOPERATION_TIMEOUT_KEY,<a name="line.595"></a>
<span class="sourceLineNo">596</span>          HConstants.DEFAULT_HBASE_RPC_SHORTOPERATION_TIMEOUT);<a name="line.596"></a>
<span class="sourceLineNo">597</span><a name="line.597"></a>
<span class="sourceLineNo">598</span>      this.abortRequested = new AtomicBoolean(false);<a name="line.598"></a>
<span class="sourceLineNo">599</span>      this.stopped = false;<a name="line.599"></a>
<span class="sourceLineNo">600</span><a name="line.600"></a>
<span class="sourceLineNo">601</span>      initNamedQueueRecorder(conf);<a name="line.601"></a>
<span class="sourceLineNo">602</span>      rpcServices = createRpcServices();<a name="line.602"></a>
<span class="sourceLineNo">603</span>      useThisHostnameInstead = getUseThisHostnameInstead(conf);<a name="line.603"></a>
<span class="sourceLineNo">604</span>      String hostName =<a name="line.604"></a>
<span class="sourceLineNo">605</span>          StringUtils.isBlank(useThisHostnameInstead) ? this.rpcServices.isa.getHostName()<a name="line.605"></a>
<span class="sourceLineNo">606</span>              : this.useThisHostnameInstead;<a name="line.606"></a>
<span class="sourceLineNo">607</span>      serverName = ServerName.valueOf(hostName, this.rpcServices.isa.getPort(), this.startcode);<a name="line.607"></a>
<span class="sourceLineNo">608</span><a name="line.608"></a>
<span class="sourceLineNo">609</span>      // login the zookeeper client principal (if using security)<a name="line.609"></a>
<span class="sourceLineNo">610</span>      ZKUtil.loginClient(this.conf, HConstants.ZK_CLIENT_KEYTAB_FILE,<a name="line.610"></a>
<span class="sourceLineNo">611</span>          HConstants.ZK_CLIENT_KERBEROS_PRINCIPAL, hostName);<a name="line.611"></a>
<span class="sourceLineNo">612</span>      // login the server principal (if using secure Hadoop)<a name="line.612"></a>
<span class="sourceLineNo">613</span>      login(userProvider, hostName);<a name="line.613"></a>
<span class="sourceLineNo">614</span>      // init superusers and add the server principal (if using security)<a name="line.614"></a>
<span class="sourceLineNo">615</span>      // or process owner as default super user.<a name="line.615"></a>
<span class="sourceLineNo">616</span>      Superusers.initialize(conf);<a name="line.616"></a>
<span class="sourceLineNo">617</span>      regionServerAccounting = new RegionServerAccounting(conf);<a name="line.617"></a>
<span class="sourceLineNo">618</span><a name="line.618"></a>
<span class="sourceLineNo">619</span>      boolean isMasterNotCarryTable =<a name="line.619"></a>
<span class="sourceLineNo">620</span>          this instanceof HMaster &amp;&amp; !LoadBalancer.isTablesOnMaster(conf);<a name="line.620"></a>
<span class="sourceLineNo">621</span><a name="line.621"></a>
<span class="sourceLineNo">622</span>      // no need to instantiate block cache and mob file cache when master not carry table<a name="line.622"></a>
<span class="sourceLineNo">623</span>      if (!isMasterNotCarryTable) {<a name="line.623"></a>
<span class="sourceLineNo">624</span>        blockCache = BlockCacheFactory.createBlockCache(conf);<a name="line.624"></a>
<span class="sourceLineNo">625</span>        mobFileCache = new MobFileCache(conf);<a name="line.625"></a>
<span class="sourceLineNo">626</span>      }<a name="line.626"></a>
<span class="sourceLineNo">627</span><a name="line.627"></a>
<span class="sourceLineNo">628</span>      uncaughtExceptionHandler =<a name="line.628"></a>
<span class="sourceLineNo">629</span>        (t, e) -&gt; abort("Uncaught exception in executorService thread " + t.getName(), e);<a name="line.629"></a>
<span class="sourceLineNo">630</span><a name="line.630"></a>
<span class="sourceLineNo">631</span>      initializeFileSystem();<a name="line.631"></a>
<span class="sourceLineNo">632</span>      spanReceiverHost = SpanReceiverHost.getInstance(getConfiguration());<a name="line.632"></a>
<span class="sourceLineNo">633</span><a name="line.633"></a>
<span class="sourceLineNo">634</span>      this.configurationManager = new ConfigurationManager();<a name="line.634"></a>
<span class="sourceLineNo">635</span>      setupWindows(getConfiguration(), getConfigurationManager());<a name="line.635"></a>
<span class="sourceLineNo">636</span><a name="line.636"></a>
<span class="sourceLineNo">637</span>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.637"></a>
<span class="sourceLineNo">638</span>      // Open connection to zookeeper and set primary watcher<a name="line.638"></a>
<span class="sourceLineNo">639</span>      zooKeeper = new ZKWatcher(conf, getProcessName() + ":" + rpcServices.isa.getPort(), this,<a name="line.639"></a>
<span class="sourceLineNo">640</span>        canCreateBaseZNode());<a name="line.640"></a>
<span class="sourceLineNo">641</span>      // If no master in cluster, skip trying to track one or look for a cluster status.<a name="line.641"></a>
<span class="sourceLineNo">642</span>      if (!this.masterless) {<a name="line.642"></a>
<span class="sourceLineNo">643</span>        if (conf.getBoolean(HBASE_SPLIT_WAL_COORDINATED_BY_ZK,<a name="line.643"></a>
<span class="sourceLineNo">644</span>          DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK)) {<a name="line.644"></a>
<span class="sourceLineNo">645</span>          this.csm = new ZkCoordinatedStateManager(this);<a name="line.645"></a>
<span class="sourceLineNo">646</span>        }<a name="line.646"></a>
<span class="sourceLineNo">647</span><a name="line.647"></a>
<span class="sourceLineNo">648</span>        masterAddressTracker = new MasterAddressTracker(getZooKeeper(), this);<a name="line.648"></a>
<span class="sourceLineNo">649</span>        masterAddressTracker.start();<a name="line.649"></a>
<span class="sourceLineNo">650</span><a name="line.650"></a>
<span class="sourceLineNo">651</span>        clusterStatusTracker = new ClusterStatusTracker(zooKeeper, this);<a name="line.651"></a>
<span class="sourceLineNo">652</span>        clusterStatusTracker.start();<a name="line.652"></a>
<span class="sourceLineNo">653</span>      } else {<a name="line.653"></a>
<span class="sourceLineNo">654</span>        masterAddressTracker = null;<a name="line.654"></a>
<span class="sourceLineNo">655</span>        clusterStatusTracker = null;<a name="line.655"></a>
<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
<span class="sourceLineNo">657</span>      this.rpcServices.start(zooKeeper);<a name="line.657"></a>
<span class="sourceLineNo">658</span>      // This violates 'no starting stuff in Constructor' but Master depends on the below chore<a name="line.658"></a>
<span class="sourceLineNo">659</span>      // and executor being created and takes a different startup route. Lots of overlap between HRS<a name="line.659"></a>
<span class="sourceLineNo">660</span>      // and M (An M IS A HRS now). Need to refactor so less duplication between M and its super<a name="line.660"></a>
<span class="sourceLineNo">661</span>      // Master expects Constructor to put up web servers. Ugh.<a name="line.661"></a>
<span class="sourceLineNo">662</span>      // class HRS. TODO.<a name="line.662"></a>
<span class="sourceLineNo">663</span>      this.choreService = new ChoreService(getName(), true);<a name="line.663"></a>
<span class="sourceLineNo">664</span>      this.executorService = new ExecutorService(getName());<a name="line.664"></a>
<span class="sourceLineNo">665</span>      putUpWebUI();<a name="line.665"></a>
<span class="sourceLineNo">666</span>    } catch (Throwable t) {<a name="line.666"></a>
<span class="sourceLineNo">667</span>      // Make sure we log the exception. HRegionServer is often started via reflection and the<a name="line.667"></a>
<span class="sourceLineNo">668</span>      // cause of failed startup is lost.<a name="line.668"></a>
<span class="sourceLineNo">669</span>      LOG.error("Failed construction RegionServer", t);<a name="line.669"></a>
<span class="sourceLineNo">670</span>      throw t;<a name="line.670"></a>
<span class="sourceLineNo">671</span>    }<a name="line.671"></a>
<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
<span class="sourceLineNo">673</span><a name="line.673"></a>
<span class="sourceLineNo">674</span>  private void initNamedQueueRecorder(Configuration conf) {<a name="line.674"></a>
<span class="sourceLineNo">675</span>    if (!(this instanceof HMaster)) {<a name="line.675"></a>
<span class="sourceLineNo">676</span>      final boolean isOnlineLogProviderEnabled = conf.getBoolean(<a name="line.676"></a>
<span class="sourceLineNo">677</span>        HConstants.SLOW_LOG_BUFFER_ENABLED_KEY,<a name="line.677"></a>
<span class="sourceLineNo">678</span>        HConstants.DEFAULT_ONLINE_LOG_PROVIDER_ENABLED);<a name="line.678"></a>
<span class="sourceLineNo">679</span>      if (isOnlineLogProviderEnabled) {<a name="line.679"></a>
<span class="sourceLineNo">680</span>        this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf);<a name="line.680"></a>
<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
<span class="sourceLineNo">682</span>    } else {<a name="line.682"></a>
<span class="sourceLineNo">683</span>      final boolean isBalancerDecisionRecording = conf<a name="line.683"></a>
<span class="sourceLineNo">684</span>        .getBoolean(BaseLoadBalancer.BALANCER_DECISION_BUFFER_ENABLED,<a name="line.684"></a>
<span class="sourceLineNo">685</span>          BaseLoadBalancer.DEFAULT_BALANCER_DECISION_BUFFER_ENABLED);<a name="line.685"></a>
<span class="sourceLineNo">686</span>      if (isBalancerDecisionRecording) {<a name="line.686"></a>
<span class="sourceLineNo">687</span>        this.namedQueueRecorder = NamedQueueRecorder.getInstance(this.conf);<a name="line.687"></a>
<span class="sourceLineNo">688</span>      }<a name="line.688"></a>
<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
<span class="sourceLineNo">691</span><a name="line.691"></a>
<span class="sourceLineNo">692</span>  // HMaster should override this method to load the specific config for master<a name="line.692"></a>
<span class="sourceLineNo">693</span>  protected String getUseThisHostnameInstead(Configuration conf) throws IOException {<a name="line.693"></a>
<span class="sourceLineNo">694</span>    String hostname = conf.get(RS_HOSTNAME_KEY);<a name="line.694"></a>
<span class="sourceLineNo">695</span>    if (conf.getBoolean(RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY, false)) {<a name="line.695"></a>
<span class="sourceLineNo">696</span>      if (!StringUtils.isBlank(hostname)) {<a name="line.696"></a>
<span class="sourceLineNo">697</span>        String msg = RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY + " and " + RS_HOSTNAME_KEY +<a name="line.697"></a>
<span class="sourceLineNo">698</span>          " are mutually exclusive. Do not set " + RS_HOSTNAME_DISABLE_MASTER_REVERSEDNS_KEY +<a name="line.698"></a>
<span class="sourceLineNo">699</span>          " to true while " + RS_HOSTNAME_KEY + " is used";<a name="line.699"></a>
<span class="sourceLineNo">700</span>        throw new IOException(msg);<a name="line.700"></a>
<span class="sourceLineNo">701</span>      } else {<a name="line.701"></a>
<span class="sourceLineNo">702</span>        return rpcServices.isa.getHostName();<a name="line.702"></a>
<span class="sourceLineNo">703</span>      }<a name="line.703"></a>
<span class="sourceLineNo">704</span>    } else {<a name="line.704"></a>
<span class="sourceLineNo">705</span>      return hostname;<a name="line.705"></a>
<span class="sourceLineNo">706</span>    }<a name="line.706"></a>
<span class="sourceLineNo">707</span>  }<a name="line.707"></a>
<span class="sourceLineNo">708</span><a name="line.708"></a>
<span class="sourceLineNo">709</span>  /**<a name="line.709"></a>
<span class="sourceLineNo">710</span>   * If running on Windows, do windows-specific setup.<a name="line.710"></a>
<span class="sourceLineNo">711</span>   */<a name="line.711"></a>
<span class="sourceLineNo">712</span>  private static void setupWindows(final Configuration conf, ConfigurationManager cm) {<a name="line.712"></a>
<span class="sourceLineNo">713</span>    if (!SystemUtils.IS_OS_WINDOWS) {<a name="line.713"></a>
<span class="sourceLineNo">714</span>      Signal.handle(new Signal("HUP"), signal -&gt; {<a name="line.714"></a>
<span class="sourceLineNo">715</span>        conf.reloadConfiguration();<a name="line.715"></a>
<span class="sourceLineNo">716</span>        cm.notifyAllObservers(conf);<a name="line.716"></a>
<span class="sourceLineNo">717</span>      });<a name="line.717"></a>
<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
<span class="sourceLineNo">720</span><a name="line.720"></a>
<span class="sourceLineNo">721</span>  private static NettyEventLoopGroupConfig setupNetty(Configuration conf) {<a name="line.721"></a>
<span class="sourceLineNo">722</span>    // Initialize netty event loop group at start as we may use it for rpc server, rpc client &amp; WAL.<a name="line.722"></a>
<span class="sourceLineNo">723</span>    NettyEventLoopGroupConfig nelgc =<a name="line.723"></a>
<span class="sourceLineNo">724</span>      new NettyEventLoopGroupConfig(conf, "RS-EventLoopGroup");<a name="line.724"></a>
<span class="sourceLineNo">725</span>    NettyRpcClientConfigHelper.setEventLoopConfig(conf, nelgc.group(), nelgc.clientChannelClass());<a name="line.725"></a>
<span class="sourceLineNo">726</span>    NettyAsyncFSWALConfigHelper.setEventLoopConfig(conf, nelgc.group(), nelgc.clientChannelClass());<a name="line.726"></a>
<span class="sourceLineNo">727</span>    return nelgc;<a name="line.727"></a>
<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
<span class="sourceLineNo">729</span><a name="line.729"></a>
<span class="sourceLineNo">730</span>  private void initializeFileSystem() throws IOException {<a name="line.730"></a>
<span class="sourceLineNo">731</span>    // Get fs instance used by this RS. Do we use checksum verification in the hbase? If hbase<a name="line.731"></a>
<span class="sourceLineNo">732</span>    // checksum verification enabled, then automatically switch off hdfs checksum verification.<a name="line.732"></a>
<span class="sourceLineNo">733</span>    boolean useHBaseChecksum = conf.getBoolean(HConstants.HBASE_CHECKSUM_VERIFICATION, true);<a name="line.733"></a>
<span class="sourceLineNo">734</span>    CommonFSUtils.setFsDefault(this.conf, CommonFSUtils.getWALRootDir(this.conf));<a name="line.734"></a>
<span class="sourceLineNo">735</span>    this.walFs = new HFileSystem(this.conf, useHBaseChecksum);<a name="line.735"></a>
<span class="sourceLineNo">736</span>    this.walRootDir = CommonFSUtils.getWALRootDir(this.conf);<a name="line.736"></a>
<span class="sourceLineNo">737</span>    // Set 'fs.defaultFS' to match the filesystem on hbase.rootdir else<a name="line.737"></a>
<span class="sourceLineNo">738</span>    // underlying hadoop hdfs accessors will be going against wrong filesystem<a name="line.738"></a>
<span class="sourceLineNo">739</span>    // (unless all is set to defaults).<a name="line.739"></a>
<span class="sourceLineNo">740</span>    CommonFSUtils.setFsDefault(this.conf, CommonFSUtils.getRootDir(this.conf));<a name="line.740"></a>
<span class="sourceLineNo">741</span>    this.dataFs = new HFileSystem(this.conf, useHBaseChecksum);<a name="line.741"></a>
<span class="sourceLineNo">742</span>    this.dataRootDir = CommonFSUtils.getRootDir(this.conf);<a name="line.742"></a>
<span class="sourceLineNo">743</span>    this.tableDescriptors = new FSTableDescriptors(this.dataFs, this.dataRootDir,<a name="line.743"></a>
<span class="sourceLineNo">744</span>      !canUpdateTableDescriptor(), cacheTableDescriptor());<a name="line.744"></a>
<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
<span class="sourceLineNo">746</span><a name="line.746"></a>
<span class="sourceLineNo">747</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.747"></a>
<span class="sourceLineNo">748</span>    user.login(SecurityConstants.REGIONSERVER_KRB_KEYTAB_FILE,<a name="line.748"></a>
<span class="sourceLineNo">749</span>      SecurityConstants.REGIONSERVER_KRB_PRINCIPAL, host);<a name="line.749"></a>
<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
<span class="sourceLineNo">751</span><a name="line.751"></a>
<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
<span class="sourceLineNo">753</span>   * Wait for an active Master.<a name="line.753"></a>
<span class="sourceLineNo">754</span>   * See override in Master superclass for how it is used.<a name="line.754"></a>
<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
<span class="sourceLineNo">756</span>  protected void waitForMasterActive() {}<a name="line.756"></a>
<span class="sourceLineNo">757</span><a name="line.757"></a>
<span class="sourceLineNo">758</span>  protected String getProcessName() {<a name="line.758"></a>
<span class="sourceLineNo">759</span>    return REGIONSERVER;<a name="line.759"></a>
<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
<span class="sourceLineNo">761</span><a name="line.761"></a>
<span class="sourceLineNo">762</span>  protected boolean canCreateBaseZNode() {<a name="line.762"></a>
<span class="sourceLineNo">763</span>    return this.masterless;<a name="line.763"></a>
<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
<span class="sourceLineNo">765</span><a name="line.765"></a>
<span class="sourceLineNo">766</span>  protected boolean canUpdateTableDescriptor() {<a name="line.766"></a>
<span class="sourceLineNo">767</span>    return false;<a name="line.767"></a>
<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
<span class="sourceLineNo">769</span><a name="line.769"></a>
<span class="sourceLineNo">770</span>  protected boolean cacheTableDescriptor() {<a name="line.770"></a>
<span class="sourceLineNo">771</span>    return false;<a name="line.771"></a>
<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
<span class="sourceLineNo">773</span><a name="line.773"></a>
<span class="sourceLineNo">774</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.774"></a>
<span class="sourceLineNo">775</span>    return new RSRpcServices(this);<a name="line.775"></a>
<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
<span class="sourceLineNo">777</span><a name="line.777"></a>
<span class="sourceLineNo">778</span>  protected void configureInfoServer() {<a name="line.778"></a>
<span class="sourceLineNo">779</span>    infoServer.addUnprivilegedServlet("rs-status", "/rs-status", RSStatusServlet.class);<a name="line.779"></a>
<span class="sourceLineNo">780</span>    infoServer.setAttribute(REGIONSERVER, this);<a name="line.780"></a>
<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
<span class="sourceLineNo">782</span><a name="line.782"></a>
<span class="sourceLineNo">783</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.783"></a>
<span class="sourceLineNo">784</span>    return RSDumpServlet.class;<a name="line.784"></a>
<span class="sourceLineNo">785</span>  }<a name="line.785"></a>
<span class="sourceLineNo">786</span><a name="line.786"></a>
<span class="sourceLineNo">787</span>  @Override<a name="line.787"></a>
<span class="sourceLineNo">788</span>  public boolean registerService(Service instance) {<a name="line.788"></a>
<span class="sourceLineNo">789</span>    // No stacking of instances is allowed for a single executorService name<a name="line.789"></a>
<span class="sourceLineNo">790</span>    ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.790"></a>
<span class="sourceLineNo">791</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.791"></a>
<span class="sourceLineNo">792</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.792"></a>
<span class="sourceLineNo">793</span>      LOG.error("Coprocessor executorService " + serviceName +<a name="line.793"></a>
<span class="sourceLineNo">794</span>        " already registered, rejecting request from " + instance);<a name="line.794"></a>
<span class="sourceLineNo">795</span>      return false;<a name="line.795"></a>
<span class="sourceLineNo">796</span>    }<a name="line.796"></a>
<span class="sourceLineNo">797</span><a name="line.797"></a>
<span class="sourceLineNo">798</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.798"></a>
<span class="sourceLineNo">799</span>    if (LOG.isDebugEnabled()) {<a name="line.799"></a>
<span class="sourceLineNo">800</span>      LOG.debug(<a name="line.800"></a>
<span class="sourceLineNo">801</span>        "Registered regionserver coprocessor executorService: executorService=" + serviceName);<a name="line.801"></a>
<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
<span class="sourceLineNo">803</span>    return true;<a name="line.803"></a>
<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
<span class="sourceLineNo">805</span><a name="line.805"></a>
<span class="sourceLineNo">806</span>  private Configuration cleanupConfiguration() {<a name="line.806"></a>
<span class="sourceLineNo">807</span>    Configuration conf = this.conf;<a name="line.807"></a>
<span class="sourceLineNo">808</span>    // We use ZKConnectionRegistry for all the internal communication, primarily for these reasons:<a name="line.808"></a>
<span class="sourceLineNo">809</span>    // - Decouples RS and master life cycles. RegionServers can continue be up independent of<a name="line.809"></a>
<span class="sourceLineNo">810</span>    //   masters' availability.<a name="line.810"></a>
<span class="sourceLineNo">811</span>    // - Configuration management for region servers (cluster internal) is much simpler when adding<a name="line.811"></a>
<span class="sourceLineNo">812</span>    //   new masters or removing existing masters, since only clients' config needs to be updated.<a name="line.812"></a>
<span class="sourceLineNo">813</span>    // - We need to retain ZKConnectionRegistry for replication use anyway, so we just extend it for<a name="line.813"></a>
<span class="sourceLineNo">814</span>    //   other internal connections too.<a name="line.814"></a>
<span class="sourceLineNo">815</span>    conf.set(HConstants.CLIENT_CONNECTION_REGISTRY_IMPL_CONF_KEY,<a name="line.815"></a>
<span class="sourceLineNo">816</span>        HConstants.ZK_CONNECTION_REGISTRY_CLASS);<a name="line.816"></a>
<span class="sourceLineNo">817</span>    if (conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM) != null) {<a name="line.817"></a>
<span class="sourceLineNo">818</span>      // Use server ZK cluster for server-issued connections, so we clone<a name="line.818"></a>
<span class="sourceLineNo">819</span>      // the conf and unset the client ZK related properties<a name="line.819"></a>
<span class="sourceLineNo">820</span>      conf = new Configuration(this.conf);<a name="line.820"></a>
<span class="sourceLineNo">821</span>      conf.unset(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.821"></a>
<span class="sourceLineNo">822</span>    }<a name="line.822"></a>
<span class="sourceLineNo">823</span>    return conf;<a name="line.823"></a>
<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
<span class="sourceLineNo">825</span><a name="line.825"></a>
<span class="sourceLineNo">826</span>  /**<a name="line.826"></a>
<span class="sourceLineNo">827</span>   * Run test on configured codecs to make sure supporting libs are in place.<a name="line.827"></a>
<span class="sourceLineNo">828</span>   */<a name="line.828"></a>
<span class="sourceLineNo">829</span>  private static void checkCodecs(final Configuration c) throws IOException {<a name="line.829"></a>
<span class="sourceLineNo">830</span>    // check to see if the codec list is available:<a name="line.830"></a>
<span class="sourceLineNo">831</span>    String [] codecs = c.getStrings(REGIONSERVER_CODEC, (String[])null);<a name="line.831"></a>
<span class="sourceLineNo">832</span>    if (codecs == null) return;<a name="line.832"></a>
<span class="sourceLineNo">833</span>    for (String codec : codecs) {<a name="line.833"></a>
<span class="sourceLineNo">834</span>      if (!CompressionTest.testCompression(codec)) {<a name="line.834"></a>
<span class="sourceLineNo">835</span>        throw new IOException("Compression codec " + codec +<a name="line.835"></a>
<span class="sourceLineNo">836</span>          " not supported, aborting RS construction");<a name="line.836"></a>
<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>  }<a name="line.839"></a>
<span class="sourceLineNo">840</span><a name="line.840"></a>
<span class="sourceLineNo">841</span>  public String getClusterId() {<a name="line.841"></a>
<span class="sourceLineNo">842</span>    return this.clusterId;<a name="line.842"></a>
<span class="sourceLineNo">843</span>  }<a name="line.843"></a>
<span class="sourceLineNo">844</span><a name="line.844"></a>
<span class="sourceLineNo">845</span>  /**<a name="line.845"></a>
<span class="sourceLineNo">846</span>   * Setup our cluster connection if not already initialized.<a name="line.846"></a>
<span class="sourceLineNo">847</span>   */<a name="line.847"></a>
<span class="sourceLineNo">848</span>  protected final synchronized void setupClusterConnection() throws IOException {<a name="line.848"></a>
<span class="sourceLineNo">849</span>    if (asyncClusterConnection == null) {<a name="line.849"></a>
<span class="sourceLineNo">850</span>      Configuration conf = cleanupConfiguration();<a name="line.850"></a>
<span class="sourceLineNo">851</span>      InetSocketAddress localAddress = new InetSocketAddress(this.rpcServices.isa.getAddress(), 0);<a name="line.851"></a>
<span class="sourceLineNo">852</span>      User user = userProvider.getCurrent();<a name="line.852"></a>
<span class="sourceLineNo">853</span>      asyncClusterConnection =<a name="line.853"></a>
<span class="sourceLineNo">854</span>        ClusterConnectionFactory.createAsyncClusterConnection(conf, localAddress, user);<a name="line.854"></a>
<span class="sourceLineNo">855</span>    }<a name="line.855"></a>
<span class="sourceLineNo">856</span>  }<a name="line.856"></a>
<span class="sourceLineNo">857</span><a name="line.857"></a>
<span class="sourceLineNo">858</span>  /**<a name="line.858"></a>
<span class="sourceLineNo">859</span>   * All initialization needed before we go register with Master.&lt;br&gt;<a name="line.859"></a>
<span class="sourceLineNo">860</span>   * Do bare minimum. Do bulk of initializations AFTER we've connected to the Master.&lt;br&gt;<a name="line.860"></a>
<span class="sourceLineNo">861</span>   * In here we just put up the RpcServer, setup Connection, and ZooKeeper.<a name="line.861"></a>
<span class="sourceLineNo">862</span>   */<a name="line.862"></a>
<span class="sourceLineNo">863</span>  private void preRegistrationInitialization() {<a name="line.863"></a>
<span class="sourceLineNo">864</span>    try {<a name="line.864"></a>
<span class="sourceLineNo">865</span>      initializeZooKeeper();<a name="line.865"></a>
<span class="sourceLineNo">866</span>      setupClusterConnection();<a name="line.866"></a>
<span class="sourceLineNo">867</span>      // Setup RPC client for master communication<a name="line.867"></a>
<span class="sourceLineNo">868</span>      this.rpcClient = asyncClusterConnection.getRpcClient();<a name="line.868"></a>
<span class="sourceLineNo">869</span>    } catch (Throwable t) {<a name="line.869"></a>
<span class="sourceLineNo">870</span>      // Call stop if error or process will stick around for ever since server<a name="line.870"></a>
<span class="sourceLineNo">871</span>      // puts up non-daemon threads.<a name="line.871"></a>
<span class="sourceLineNo">872</span>      this.rpcServices.stop();<a name="line.872"></a>
<span class="sourceLineNo">873</span>      abort("Initialization of RS failed.  Hence aborting RS.", t);<a name="line.873"></a>
<span class="sourceLineNo">874</span>    }<a name="line.874"></a>
<span class="sourceLineNo">875</span>  }<a name="line.875"></a>
<span class="sourceLineNo">876</span><a name="line.876"></a>
<span class="sourceLineNo">877</span>  /**<a name="line.877"></a>
<span class="sourceLineNo">878</span>   * Bring up connection to zk ensemble and then wait until a master for this cluster and then after<a name="line.878"></a>
<span class="sourceLineNo">879</span>   * that, wait until cluster 'up' flag has been set. This is the order in which master does things.<a name="line.879"></a>
<span class="sourceLineNo">880</span>   * &lt;p&gt;<a name="line.880"></a>
<span class="sourceLineNo">881</span>   * Finally open long-living server short-circuit connection.<a name="line.881"></a>
<span class="sourceLineNo">882</span>   */<a name="line.882"></a>
<span class="sourceLineNo">883</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE",<a name="line.883"></a>
<span class="sourceLineNo">884</span>    justification="cluster Id znode read would give us correct response")<a name="line.884"></a>
<span class="sourceLineNo">885</span>  private void initializeZooKeeper() throws IOException, InterruptedException {<a name="line.885"></a>
<span class="sourceLineNo">886</span>    // Nothing to do in here if no Master in the mix.<a name="line.886"></a>
<span class="sourceLineNo">887</span>    if (this.masterless) {<a name="line.887"></a>
<span class="sourceLineNo">888</span>      return;<a name="line.888"></a>
<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
<span class="sourceLineNo">890</span><a name="line.890"></a>
<span class="sourceLineNo">891</span>    // Create the master address tracker, register with zk, and start it.  Then<a name="line.891"></a>
<span class="sourceLineNo">892</span>    // block until a master is available.  No point in starting up if no master<a name="line.892"></a>
<span class="sourceLineNo">893</span>    // running.<a name="line.893"></a>
<span class="sourceLineNo">894</span>    blockAndCheckIfStopped(this.masterAddressTracker);<a name="line.894"></a>
<span class="sourceLineNo">895</span><a name="line.895"></a>
<span class="sourceLineNo">896</span>    // Wait on cluster being up.  Master will set this flag up in zookeeper<a name="line.896"></a>
<span class="sourceLineNo">897</span>    // when ready.<a name="line.897"></a>
<span class="sourceLineNo">898</span>    blockAndCheckIfStopped(this.clusterStatusTracker);<a name="line.898"></a>
<span class="sourceLineNo">899</span><a name="line.899"></a>
<span class="sourceLineNo">900</span>    // If we are HMaster then the cluster id should have already been set.<a name="line.900"></a>
<span class="sourceLineNo">901</span>    if (clusterId == null) {<a name="line.901"></a>
<span class="sourceLineNo">902</span>      // Retrieve clusterId<a name="line.902"></a>
<span class="sourceLineNo">903</span>      // Since cluster status is now up<a name="line.903"></a>
<span class="sourceLineNo">904</span>      // ID should have already been set by HMaster<a name="line.904"></a>
<span class="sourceLineNo">905</span>      try {<a name="line.905"></a>
<span class="sourceLineNo">906</span>        clusterId = ZKClusterId.readClusterIdZNode(this.zooKeeper);<a name="line.906"></a>
<span class="sourceLineNo">907</span>        if (clusterId == null) {<a name="line.907"></a>
<span class="sourceLineNo">908</span>          this.abort("Cluster ID has not been set");<a name="line.908"></a>
<span class="sourceLineNo">909</span>        }<a name="line.909"></a>
<span class="sourceLineNo">910</span>        LOG.info("ClusterId : " + clusterId);<a name="line.910"></a>
<span class="sourceLineNo">911</span>      } catch (KeeperException e) {<a name="line.911"></a>
<span class="sourceLineNo">912</span>        this.abort("Failed to retrieve Cluster ID", e);<a name="line.912"></a>
<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
<span class="sourceLineNo">915</span><a name="line.915"></a>
<span class="sourceLineNo">916</span>    waitForMasterActive();<a name="line.916"></a>
<span class="sourceLineNo">917</span>    if (isStopped() || isAborted()) {<a name="line.917"></a>
<span class="sourceLineNo">918</span>      return; // No need for further initialization<a name="line.918"></a>
<span class="sourceLineNo">919</span>    }<a name="line.919"></a>
<span class="sourceLineNo">920</span><a name="line.920"></a>
<span class="sourceLineNo">921</span>    // watch for snapshots and other procedures<a name="line.921"></a>
<span class="sourceLineNo">922</span>    try {<a name="line.922"></a>
<span class="sourceLineNo">923</span>      rspmHost = new RegionServerProcedureManagerHost();<a name="line.923"></a>
<span class="sourceLineNo">924</span>      rspmHost.loadProcedures(conf);<a name="line.924"></a>
<span class="sourceLineNo">925</span>      rspmHost.initialize(this);<a name="line.925"></a>
<span class="sourceLineNo">926</span>    } catch (KeeperException e) {<a name="line.926"></a>
<span class="sourceLineNo">927</span>      this.abort("Failed to reach coordination cluster when creating procedure handler.", e);<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><a name="line.930"></a>
<span class="sourceLineNo">931</span>  /**<a name="line.931"></a>
<span class="sourceLineNo">932</span>   * Utilty method to wait indefinitely on a znode availability while checking<a name="line.932"></a>
<span class="sourceLineNo">933</span>   * if the region server is shut down<a name="line.933"></a>
<span class="sourceLineNo">934</span>   * @param tracker znode tracker to use<a name="line.934"></a>
<span class="sourceLineNo">935</span>   * @throws IOException any IO exception, plus if the RS is stopped<a name="line.935"></a>
<span class="sourceLineNo">936</span>   * @throws InterruptedException if the waiting thread is interrupted<a name="line.936"></a>
<span class="sourceLineNo">937</span>   */<a name="line.937"></a>
<span class="sourceLineNo">938</span>  private void blockAndCheckIfStopped(ZKNodeTracker tracker)<a name="line.938"></a>
<span class="sourceLineNo">939</span>      throws IOException, InterruptedException {<a name="line.939"></a>
<span class="sourceLineNo">940</span>    while (tracker.blockUntilAvailable(this.msgInterval, false) == null) {<a name="line.940"></a>
<span class="sourceLineNo">941</span>      if (this.stopped) {<a name="line.941"></a>
<span class="sourceLineNo">942</span>        throw new IOException("Received the shutdown message while waiting.");<a name="line.942"></a>
<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
<span class="sourceLineNo">944</span>    }<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>  /**<a name="line.947"></a>
<span class="sourceLineNo">948</span>   * @return True if the cluster is up.<a name="line.948"></a>
<span class="sourceLineNo">949</span>   */<a name="line.949"></a>
<span class="sourceLineNo">950</span>  @Override<a name="line.950"></a>
<span class="sourceLineNo">951</span>  public boolean isClusterUp() {<a name="line.951"></a>
<span class="sourceLineNo">952</span>    return this.masterless ||<a name="line.952"></a>
<span class="sourceLineNo">953</span>        (this.clusterStatusTracker != null &amp;&amp; this.clusterStatusTracker.isClusterUp());<a name="line.953"></a>
<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
<span class="sourceLineNo">955</span><a name="line.955"></a>
<span class="sourceLineNo">956</span>  /**<a name="line.956"></a>
<span class="sourceLineNo">957</span>   * The HRegionServer sticks in this loop until closed.<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 void run() {<a name="line.960"></a>
<span class="sourceLineNo">961</span>    if (isStopped()) {<a name="line.961"></a>
<span class="sourceLineNo">962</span>      LOG.info("Skipping run; stopped");<a name="line.962"></a>
<span class="sourceLineNo">963</span>      return;<a name="line.963"></a>
<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
<span class="sourceLineNo">965</span>    try {<a name="line.965"></a>
<span class="sourceLineNo">966</span>      // Do pre-registration initializations; zookeeper, lease threads, etc.<a name="line.966"></a>
<span class="sourceLineNo">967</span>      preRegistrationInitialization();<a name="line.967"></a>
<span class="sourceLineNo">968</span>    } catch (Throwable e) {<a name="line.968"></a>
<span class="sourceLineNo">969</span>      abort("Fatal exception during initialization", e);<a name="line.969"></a>
<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
<span class="sourceLineNo">971</span><a name="line.971"></a>
<span class="sourceLineNo">972</span>    try {<a name="line.972"></a>
<span class="sourceLineNo">973</span>      if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.973"></a>
<span class="sourceLineNo">974</span>        ShutdownHook.install(conf, dataFs, this, Thread.currentThread());<a name="line.974"></a>
<span class="sourceLineNo">975</span>        // Initialize the RegionServerCoprocessorHost now that our ephemeral<a name="line.975"></a>
<span class="sourceLineNo">976</span>        // node was created, in case any coprocessors want to use ZooKeeper<a name="line.976"></a>
<span class="sourceLineNo">977</span>        this.rsHost = new RegionServerCoprocessorHost(this, this.conf);<a name="line.977"></a>
<span class="sourceLineNo">978</span><a name="line.978"></a>
<span class="sourceLineNo">979</span>        // Try and register with the Master; tell it we are here.  Break if server is stopped or<a name="line.979"></a>
<span class="sourceLineNo">980</span>        // the clusterup flag is down or hdfs went wacky. Once registered successfully, go ahead and<a name="line.980"></a>
<span class="sourceLineNo">981</span>        // start up all Services. Use RetryCounter to get backoff in case Master is struggling to<a name="line.981"></a>
<span class="sourceLineNo">982</span>        // come up.<a name="line.982"></a>
<span class="sourceLineNo">983</span>        LOG.debug("About to register with Master.");<a name="line.983"></a>
<span class="sourceLineNo">984</span>        RetryCounterFactory rcf =<a name="line.984"></a>
<span class="sourceLineNo">985</span>          new RetryCounterFactory(Integer.MAX_VALUE, this.sleeper.getPeriod(), 1000 * 60 * 5);<a name="line.985"></a>
<span class="sourceLineNo">986</span>        RetryCounter rc = rcf.create();<a name="line.986"></a>
<span class="sourceLineNo">987</span>        while (keepLooping()) {<a name="line.987"></a>
<span class="sourceLineNo">988</span>          RegionServerStartupResponse w = reportForDuty();<a name="line.988"></a>
<span class="sourceLineNo">989</span>          if (w == null) {<a name="line.989"></a>
<span class="sourceLineNo">990</span>            long sleepTime = rc.getBackoffTimeAndIncrementAttempts();<a name="line.990"></a>
<span class="sourceLineNo">991</span>            LOG.warn("reportForDuty failed; sleeping {} ms and then retrying.", sleepTime);<a name="line.991"></a>
<span class="sourceLineNo">992</span>            this.sleeper.sleep(sleepTime);<a name="line.992"></a>
<span class="sourceLineNo">993</span>          } else {<a name="line.993"></a>
<span class="sourceLineNo">994</span>            handleReportForDutyResponse(w);<a name="line.994"></a>
<span class="sourceLineNo">995</span>            break;<a name="line.995"></a>
<span class="sourceLineNo">996</span>          }<a name="line.996"></a>
<span class="sourceLineNo">997</span>        }<a name="line.997"></a>
<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
<span class="sourceLineNo">999</span><a name="line.999"></a>
<span class="sourceLineNo">1000</span>      if (!isStopped() &amp;&amp; isHealthy()) {<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>        // start the snapshot handler and other procedure handlers,<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>        // since the server is ready to run<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>        if (this.rspmHost != null) {<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>          this.rspmHost.start();<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>        }<a name="line.1005"></a>
<span class="sourceLineNo">1006</span>        // Start the Quota Manager<a name="line.1006"></a>
<span class="sourceLineNo">1007</span>        if (this.rsQuotaManager != null) {<a name="line.1007"></a>
<span class="sourceLineNo">1008</span>          rsQuotaManager.start(getRpcServer().getScheduler());<a name="line.1008"></a>
<span class="sourceLineNo">1009</span>        }<a name="line.1009"></a>
<span class="sourceLineNo">1010</span>        if (this.rsSpaceQuotaManager != null) {<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>          this.rsSpaceQuotaManager.start();<a name="line.1011"></a>
<span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
<span class="sourceLineNo">1013</span>      }<a name="line.1013"></a>
<span class="sourceLineNo">1014</span><a name="line.1014"></a>
<span class="sourceLineNo">1015</span>      // We registered with the Master.  Go into run mode.<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>      long lastMsg = System.currentTimeMillis();<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>      long oldRequestCount = -1;<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>      // The main run loop.<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>      while (!isStopped() &amp;&amp; isHealthy()) {<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>        if (!isClusterUp()) {<a name="line.1020"></a>
<span class="sourceLineNo">1021</span>          if (onlineRegions.isEmpty()) {<a name="line.1021"></a>
<span class="sourceLineNo">1022</span>            stop("Exiting; cluster shutdown set and not carrying any regions");<a name="line.1022"></a>
<span class="sourceLineNo">1023</span>          } else if (!this.stopping) {<a name="line.1023"></a>
<span class="sourceLineNo">1024</span>            this.stopping = true;<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>            LOG.info("Closing user regions");<a name="line.1025"></a>
<span class="sourceLineNo">1026</span>            closeUserRegions(this.abortRequested.get());<a name="line.1026"></a>
<span class="sourceLineNo">1027</span>          } else {<a name="line.1027"></a>
<span class="sourceLineNo">1028</span>            boolean allUserRegionsOffline = areAllUserRegionsOffline();<a name="line.1028"></a>
<span class="sourceLineNo">1029</span>            if (allUserRegionsOffline) {<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>              // Set stopped if no more write requests tp meta tables<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>              // since last time we went around the loop.  Any open<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>              // meta regions will be closed on our way out.<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>              if (oldRequestCount == getWriteRequestCount()) {<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>                stop("Stopped; only catalog regions remaining online");<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>                break;<a name="line.1035"></a>
<span class="sourceLineNo">1036</span>              }<a name="line.1036"></a>
<span class="sourceLineNo">1037</span>              oldRequestCount = getWriteRequestCount();<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>            } else {<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>              // Make sure all regions have been closed -- some regions may<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>              // have not got it because we were splitting at the time of<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>              // the call to closeUserRegions.<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>              closeUserRegions(this.abortRequested.get());<a name="line.1042"></a>
<span class="sourceLineNo">1043</span>            }<a name="line.1043"></a>
<span class="sourceLineNo">1044</span>            LOG.debug("Waiting on " + getOnlineRegionsAsPrintableString());<a name="line.1044"></a>
<span class="sourceLineNo">1045</span>          }<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>        }<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>        long now = System.currentTimeMillis();<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>        if ((now - lastMsg) &gt;= msgInterval) {<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>          tryRegionServerReport(lastMsg, now);<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>          lastMsg = System.currentTimeMillis();<a name="line.1050"></a>
<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
<span class="sourceLineNo">1052</span>        if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>          this.sleeper.sleep();<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>        }<a name="line.1054"></a>
<span class="sourceLineNo">1055</span>      } // for<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>    } catch (Throwable t) {<a name="line.1056"></a>
<span class="sourceLineNo">1057</span>      if (!rpcServices.checkOOME(t)) {<a name="line.1057"></a>
<span class="sourceLineNo">1058</span>        String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>        abort(prefix + t.getMessage(), t);<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>      }<a name="line.1060"></a>
<span class="sourceLineNo">1061</span>    }<a name="line.1061"></a>
<span class="sourceLineNo">1062</span><a name="line.1062"></a>
<span class="sourceLineNo">1063</span>    if (this.leaseManager != null) {<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>      this.leaseManager.closeAfterLeasesExpire();<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>    }<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>    if (this.splitLogWorker != null) {<a name="line.1066"></a>
<span class="sourceLineNo">1067</span>      splitLogWorker.stop();<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>    }<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>    if (this.infoServer != null) {<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>      LOG.info("Stopping infoServer");<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>      try {<a name="line.1071"></a>
<span class="sourceLineNo">1072</span>        this.infoServer.stop();<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>      } catch (Exception e) {<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>        LOG.error("Failed to stop infoServer", e);<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>    }<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>    // Send cache a shutdown.<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>    if (blockCache != null) {<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>      blockCache.shutdown();<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>    }<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>    if (mobFileCache != null) {<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>      mobFileCache.shutdown();<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
<span class="sourceLineNo">1084</span><a name="line.1084"></a>
<span class="sourceLineNo">1085</span>    // Send interrupts to wake up threads if sleeping so they notice shutdown.<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>    // TODO: Should we check they are alive? If OOME could have exited already<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>    if (this.hMemManager != null) this.hMemManager.stop();<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();<a name="line.1089"></a>
<span class="sourceLineNo">1090</span><a name="line.1090"></a>
<span class="sourceLineNo">1091</span>    // Stop the snapshot and other procedure handlers, forcefully killing all running tasks<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>    if (rspmHost != null) {<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>      rspmHost.stop(this.abortRequested.get() || this.killed);<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>    if (this.killed) {<a name="line.1096"></a>
<span class="sourceLineNo">1097</span>      // Just skip out w/o closing regions.  Used when testing.<a name="line.1097"></a>
<span class="sourceLineNo">1098</span>    } else if (abortRequested.get()) {<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>      if (this.dataFsOk) {<a name="line.1099"></a>
<span class="sourceLineNo">1100</span>        closeUserRegions(abortRequested.get()); // Don't leave any open file handles<a name="line.1100"></a>
<span class="sourceLineNo">1101</span>      }<a name="line.1101"></a>
<span class="sourceLineNo">1102</span>      LOG.info("aborting server " + this.serverName);<a name="line.1102"></a>
<span class="sourceLineNo">1103</span>    } else {<a name="line.1103"></a>
<span class="sourceLineNo">1104</span>      closeUserRegions(abortRequested.get());<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>      LOG.info("stopping server " + this.serverName);<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>    }<a name="line.1106"></a>
<span class="sourceLineNo">1107</span><a name="line.1107"></a>
<span class="sourceLineNo">1108</span>    if (this.asyncClusterConnection != null) {<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>      try {<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>        this.asyncClusterConnection.close();<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>      } catch (IOException e) {<a name="line.1111"></a>
<span class="sourceLineNo">1112</span>        // Although the {@link Closeable} interface throws an {@link<a name="line.1112"></a>
<span class="sourceLineNo">1113</span>        // IOException}, in reality, the implementation would never do that.<a name="line.1113"></a>
<span class="sourceLineNo">1114</span>        LOG.warn("Attempt to close server's AsyncClusterConnection failed.", e);<a name="line.1114"></a>
<span class="sourceLineNo">1115</span>      }<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
<span class="sourceLineNo">1117</span>    // Closing the compactSplit thread before closing meta regions<a name="line.1117"></a>
<span class="sourceLineNo">1118</span>    if (!this.killed &amp;&amp; containsMetaTableRegions()) {<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>      if (!abortRequested.get() || this.dataFsOk) {<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>        if (this.compactSplitThread != null) {<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>          this.compactSplitThread.join();<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>          this.compactSplitThread = null;<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>        }<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>        closeMetaTableRegions(abortRequested.get());<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>      }<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>    if (!this.killed &amp;&amp; this.dataFsOk) {<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>      waitOnAllRegionsToClose(abortRequested.get());<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>      LOG.info("stopping server " + this.serverName + "; all regions closed.");<a name="line.1130"></a>
<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
<span class="sourceLineNo">1132</span><a name="line.1132"></a>
<span class="sourceLineNo">1133</span>    // Stop the quota manager<a name="line.1133"></a>
<span class="sourceLineNo">1134</span>    if (rsQuotaManager != null) {<a name="line.1134"></a>
<span class="sourceLineNo">1135</span>      rsQuotaManager.stop();<a name="line.1135"></a>
<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
<span class="sourceLineNo">1137</span>    if (rsSpaceQuotaManager != null) {<a name="line.1137"></a>
<span class="sourceLineNo">1138</span>      rsSpaceQuotaManager.stop();<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>      rsSpaceQuotaManager = null;<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
<span class="sourceLineNo">1141</span><a name="line.1141"></a>
<span class="sourceLineNo">1142</span>    // flag may be changed when closing regions throws exception.<a name="line.1142"></a>
<span class="sourceLineNo">1143</span>    if (this.dataFsOk) {<a name="line.1143"></a>
<span class="sourceLineNo">1144</span>      shutdownWAL(!abortRequested.get());<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>    // Make sure the proxy is down.<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>    if (this.rssStub != null) {<a name="line.1148"></a>
<span class="sourceLineNo">1149</span>      this.rssStub = null;<a name="line.1149"></a>
<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>    if (this.lockStub != null) {<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>      this.lockStub = null;<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>    }<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>    if (this.rpcClient != null) {<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>      this.rpcClient.close();<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>    }<a name="line.1156"></a>
<span class="sourceLineNo">1157</span>    if (this.leaseManager != null) {<a name="line.1157"></a>
<span class="sourceLineNo">1158</span>      this.leaseManager.close();<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>    }<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>    if (this.pauseMonitor != null) {<a name="line.1160"></a>
<span class="sourceLineNo">1161</span>      this.pauseMonitor.stop();<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>    if (!killed) {<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>      stopServiceThreads();<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>    if (this.rpcServices != null) {<a name="line.1168"></a>
<span class="sourceLineNo">1169</span>      this.rpcServices.stop();<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>    }<a name="line.1170"></a>
<span class="sourceLineNo">1171</span><a name="line.1171"></a>
<span class="sourceLineNo">1172</span>    try {<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>      deleteMyEphemeralNode();<a name="line.1173"></a>
<span class="sourceLineNo">1174</span>    } catch (KeeperException.NoNodeException nn) {<a name="line.1174"></a>
<span class="sourceLineNo">1175</span>      // pass<a name="line.1175"></a>
<span class="sourceLineNo">1176</span>    } catch (KeeperException e) {<a name="line.1176"></a>
<span class="sourceLineNo">1177</span>      LOG.warn("Failed deleting my ephemeral node", e);<a name="line.1177"></a>
<span class="sourceLineNo">1178</span>    }<a name="line.1178"></a>
<span class="sourceLineNo">1179</span>    // We may have failed to delete the znode at the previous step, but<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>    ZNodeClearer.deleteMyEphemeralNodeOnDisk();<a name="line.1181"></a>
<span class="sourceLineNo">1182</span><a name="line.1182"></a>
<span class="sourceLineNo">1183</span>    if (this.zooKeeper != null) {<a name="line.1183"></a>
<span class="sourceLineNo">1184</span>      this.zooKeeper.close();<a name="line.1184"></a>
<span class="sourceLineNo">1185</span>    }<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>    this.shutDown = true;<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>    LOG.info("Exiting; stopping=" + this.serverName + "; zookeeper connection closed.");<a name="line.1187"></a>
<span class="sourceLineNo">1188</span>  }<a name="line.1188"></a>
<span class="sourceLineNo">1189</span><a name="line.1189"></a>
<span class="sourceLineNo">1190</span>  private boolean containsMetaTableRegions() {<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>    return onlineRegions.containsKey(RegionInfoBuilder.FIRST_META_REGIONINFO.getEncodedName());<a name="line.1191"></a>
<span class="sourceLineNo">1192</span>  }<a name="line.1192"></a>
<span class="sourceLineNo">1193</span><a name="line.1193"></a>
<span class="sourceLineNo">1194</span>  private boolean areAllUserRegionsOffline() {<a name="line.1194"></a>
<span class="sourceLineNo">1195</span>    if (getNumberOfOnlineRegions() &gt; 2) return false;<a name="line.1195"></a>
<span class="sourceLineNo">1196</span>    boolean allUserRegionsOffline = true;<a name="line.1196"></a>
<span class="sourceLineNo">1197</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1197"></a>
<span class="sourceLineNo">1198</span>      if (!e.getValue().getRegionInfo().isMetaRegion()) {<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>        allUserRegionsOffline = false;<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>        break;<a name="line.1200"></a>
<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>    return allUserRegionsOffline;<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>  }<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>   * @return Current write count for all online regions.<a name="line.1207"></a>
<span class="sourceLineNo">1208</span>   */<a name="line.1208"></a>
<span class="sourceLineNo">1209</span>  private long getWriteRequestCount() {<a name="line.1209"></a>
<span class="sourceLineNo">1210</span>    long writeCount = 0;<a name="line.1210"></a>
<span class="sourceLineNo">1211</span>    for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.1211"></a>
<span class="sourceLineNo">1212</span>      writeCount += e.getValue().getWriteRequestsCount();<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>    return writeCount;<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
<span class="sourceLineNo">1216</span><a name="line.1216"></a>
<span class="sourceLineNo">1217</span>  @VisibleForTesting<a name="line.1217"></a>
<span class="sourceLineNo">1218</span>  protected void tryRegionServerReport(long reportStartTime, long reportEndTime)<a name="line.1218"></a>
<span class="sourceLineNo">1219</span>      throws IOException {<a name="line.1219"></a>
<span class="sourceLineNo">1220</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1220"></a>
<span class="sourceLineNo">1221</span>    if (rss == null) {<a name="line.1221"></a>
<span class="sourceLineNo">1222</span>      // the current server could be stopping.<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>      return;<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>    }<a name="line.1224"></a>
<span class="sourceLineNo">1225</span>    ClusterStatusProtos.ServerLoad sl = buildServerLoad(reportStartTime, reportEndTime);<a name="line.1225"></a>
<span class="sourceLineNo">1226</span>    try {<a name="line.1226"></a>
<span class="sourceLineNo">1227</span>      RegionServerReportRequest.Builder request = RegionServerReportRequest.newBuilder();<a name="line.1227"></a>
<span class="sourceLineNo">1228</span>      request.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>      request.setLoad(sl);<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>      rss.regionServerReport(null, request.build());<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>    } catch (ServiceException se) {<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>      if (ioe instanceof YouAreDeadException) {<a name="line.1233"></a>
<span class="sourceLineNo">1234</span>        // This will be caught and handled as a fatal error in run()<a name="line.1234"></a>
<span class="sourceLineNo">1235</span>        throw ioe;<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>      }<a name="line.1236"></a>
<span class="sourceLineNo">1237</span>      if (rssStub == rss) {<a name="line.1237"></a>
<span class="sourceLineNo">1238</span>        rssStub = null;<a name="line.1238"></a>
<span class="sourceLineNo">1239</span>      }<a name="line.1239"></a>
<span class="sourceLineNo">1240</span>      // Couldn't connect to the master, get location from zk and reconnect<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>      // Method blocks until new master is found or we are stopped<a name="line.1241"></a>
<span class="sourceLineNo">1242</span>      createRegionServerStatusStub(true);<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>  /**<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>   * Reports the given map of Regions and their size on the filesystem to the active Master.<a name="line.1247"></a>
<span class="sourceLineNo">1248</span>   *<a name="line.1248"></a>
<span class="sourceLineNo">1249</span>   * @param regionSizeStore The store containing region sizes<a name="line.1249"></a>
<span class="sourceLineNo">1250</span>   * @return false if FileSystemUtilizationChore should pause reporting to master. true otherwise<a name="line.1250"></a>
<span class="sourceLineNo">1251</span>   */<a name="line.1251"></a>
<span class="sourceLineNo">1252</span>  public boolean reportRegionSizesForQuotas(RegionSizeStore regionSizeStore) {<a name="line.1252"></a>
<span class="sourceLineNo">1253</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>    if (rss == null) {<a name="line.1254"></a>
<span class="sourceLineNo">1255</span>      // the current server could be stopping.<a name="line.1255"></a>
<span class="sourceLineNo">1256</span>      LOG.trace("Skipping Region size report to HMaster as stub is null");<a name="line.1256"></a>
<span class="sourceLineNo">1257</span>      return true;<a name="line.1257"></a>
<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
<span class="sourceLineNo">1259</span>    try {<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>      buildReportAndSend(rss, regionSizeStore);<a name="line.1260"></a>
<span class="sourceLineNo">1261</span>    } catch (ServiceException se) {<a name="line.1261"></a>
<span class="sourceLineNo">1262</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>      if (ioe instanceof PleaseHoldException) {<a name="line.1263"></a>
<span class="sourceLineNo">1264</span>        LOG.trace("Failed to report region sizes to Master because it is initializing."<a name="line.1264"></a>
<span class="sourceLineNo">1265</span>            + " This will be retried.", ioe);<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>        return true;<a name="line.1267"></a>
<span class="sourceLineNo">1268</span>      }<a name="line.1268"></a>
<span class="sourceLineNo">1269</span>      if (rssStub == rss) {<a name="line.1269"></a>
<span class="sourceLineNo">1270</span>        rssStub = null;<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>      }<a name="line.1271"></a>
<span class="sourceLineNo">1272</span>      createRegionServerStatusStub(true);<a name="line.1272"></a>
<span class="sourceLineNo">1273</span>      if (ioe instanceof DoNotRetryIOException) {<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>        DoNotRetryIOException doNotRetryEx = (DoNotRetryIOException) ioe;<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>        if (doNotRetryEx.getCause() != null) {<a name="line.1275"></a>
<span class="sourceLineNo">1276</span>          Throwable t = doNotRetryEx.getCause();<a name="line.1276"></a>
<span class="sourceLineNo">1277</span>          if (t instanceof UnsupportedOperationException) {<a name="line.1277"></a>
<span class="sourceLineNo">1278</span>            LOG.debug("master doesn't support ReportRegionSpaceUse, pause before retrying");<a name="line.1278"></a>
<span class="sourceLineNo">1279</span>            return false;<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>          }<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>      LOG.debug("Failed to report region sizes to Master. This will be retried.", ioe);<a name="line.1283"></a>
<span class="sourceLineNo">1284</span>    }<a name="line.1284"></a>
<span class="sourceLineNo">1285</span>    return true;<a name="line.1285"></a>
<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
<span class="sourceLineNo">1287</span><a name="line.1287"></a>
<span class="sourceLineNo">1288</span>  /**<a name="line.1288"></a>
<span class="sourceLineNo">1289</span>   * Builds the region size report and sends it to the master. Upon successful sending of the<a name="line.1289"></a>
<span class="sourceLineNo">1290</span>   * report, the region sizes that were sent are marked as sent.<a name="line.1290"></a>
<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
<span class="sourceLineNo">1292</span>   * @param rss The stub to send to the Master<a name="line.1292"></a>
<span class="sourceLineNo">1293</span>   * @param regionSizeStore The store containing region sizes<a name="line.1293"></a>
<span class="sourceLineNo">1294</span>   */<a name="line.1294"></a>
<span class="sourceLineNo">1295</span>  private void buildReportAndSend(RegionServerStatusService.BlockingInterface rss,<a name="line.1295"></a>
<span class="sourceLineNo">1296</span>      RegionSizeStore regionSizeStore) throws ServiceException {<a name="line.1296"></a>
<span class="sourceLineNo">1297</span>    RegionSpaceUseReportRequest request =<a name="line.1297"></a>
<span class="sourceLineNo">1298</span>        buildRegionSpaceUseReportRequest(Objects.requireNonNull(regionSizeStore));<a name="line.1298"></a>
<span class="sourceLineNo">1299</span>    rss.reportRegionSpaceUse(null, request);<a name="line.1299"></a>
<span class="sourceLineNo">1300</span>    // Record the number of size reports sent<a name="line.1300"></a>
<span class="sourceLineNo">1301</span>    if (metricsRegionServer != null) {<a name="line.1301"></a>
<span class="sourceLineNo">1302</span>      metricsRegionServer.incrementNumRegionSizeReportsSent(regionSizeStore.size());<a name="line.1302"></a>
<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
<span class="sourceLineNo">1305</span><a name="line.1305"></a>
<span class="sourceLineNo">1306</span>  /**<a name="line.1306"></a>
<span class="sourceLineNo">1307</span>   * Builds a {@link RegionSpaceUseReportRequest} protobuf message from the region size map.<a name="line.1307"></a>
<span class="sourceLineNo">1308</span>   *<a name="line.1308"></a>
<span class="sourceLineNo">1309</span>   * @param regionSizes The size in bytes of regions<a name="line.1309"></a>
<span class="sourceLineNo">1310</span>   * @return The corresponding protocol buffer message.<a name="line.1310"></a>
<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
<span class="sourceLineNo">1312</span>  RegionSpaceUseReportRequest buildRegionSpaceUseReportRequest(RegionSizeStore regionSizes) {<a name="line.1312"></a>
<span class="sourceLineNo">1313</span>    RegionSpaceUseReportRequest.Builder request = RegionSpaceUseReportRequest.newBuilder();<a name="line.1313"></a>
<span class="sourceLineNo">1314</span>    for (Entry&lt;RegionInfo, RegionSize&gt; entry : regionSizes) {<a name="line.1314"></a>
<span class="sourceLineNo">1315</span>      request.addSpaceUse(convertRegionSize(entry.getKey(), entry.getValue().getSize()));<a name="line.1315"></a>
<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
<span class="sourceLineNo">1317</span>    return request.build();<a name="line.1317"></a>
<span class="sourceLineNo">1318</span>  }<a name="line.1318"></a>
<span class="sourceLineNo">1319</span><a name="line.1319"></a>
<span class="sourceLineNo">1320</span>  /**<a name="line.1320"></a>
<span class="sourceLineNo">1321</span>   * Converts a pair of {@link RegionInfo} and {@code long} into a {@link RegionSpaceUse}<a name="line.1321"></a>
<span class="sourceLineNo">1322</span>   * protobuf message.<a name="line.1322"></a>
<span class="sourceLineNo">1323</span>   *<a name="line.1323"></a>
<span class="sourceLineNo">1324</span>   * @param regionInfo The RegionInfo<a name="line.1324"></a>
<span class="sourceLineNo">1325</span>   * @param sizeInBytes The size in bytes of the Region<a name="line.1325"></a>
<span class="sourceLineNo">1326</span>   * @return The protocol buffer<a name="line.1326"></a>
<span class="sourceLineNo">1327</span>   */<a name="line.1327"></a>
<span class="sourceLineNo">1328</span>  RegionSpaceUse convertRegionSize(RegionInfo regionInfo, Long sizeInBytes) {<a name="line.1328"></a>
<span class="sourceLineNo">1329</span>    return RegionSpaceUse.newBuilder()<a name="line.1329"></a>
<span class="sourceLineNo">1330</span>        .setRegionInfo(ProtobufUtil.toRegionInfo(Objects.requireNonNull(regionInfo)))<a name="line.1330"></a>
<span class="sourceLineNo">1331</span>        .setRegionSize(Objects.requireNonNull(sizeInBytes))<a name="line.1331"></a>
<span class="sourceLineNo">1332</span>        .build();<a name="line.1332"></a>
<span class="sourceLineNo">1333</span>  }<a name="line.1333"></a>
<span class="sourceLineNo">1334</span><a name="line.1334"></a>
<span class="sourceLineNo">1335</span>  private ClusterStatusProtos.ServerLoad buildServerLoad(long reportStartTime, long reportEndTime)<a name="line.1335"></a>
<span class="sourceLineNo">1336</span>      throws IOException {<a name="line.1336"></a>
<span class="sourceLineNo">1337</span>    // We're getting the MetricsRegionServerWrapper here because the wrapper computes requests<a name="line.1337"></a>
<span class="sourceLineNo">1338</span>    // per second, and other metrics  As long as metrics are part of ServerLoad it's best to use<a name="line.1338"></a>
<span class="sourceLineNo">1339</span>    // the wrapper to compute those numbers in one place.<a name="line.1339"></a>
<span class="sourceLineNo">1340</span>    // In the long term most of these should be moved off of ServerLoad and the heart beat.<a name="line.1340"></a>
<span class="sourceLineNo">1341</span>    // Instead they should be stored in an HBase table so that external visibility into HBase is<a name="line.1341"></a>
<span class="sourceLineNo">1342</span>    // improved; Additionally the load balancer will be able to take advantage of a more complete<a name="line.1342"></a>
<span class="sourceLineNo">1343</span>    // history.<a name="line.1343"></a>
<span class="sourceLineNo">1344</span>    MetricsRegionServerWrapper regionServerWrapper = metricsRegionServer.getRegionServerWrapper();<a name="line.1344"></a>
<span class="sourceLineNo">1345</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.1345"></a>
<span class="sourceLineNo">1346</span>    long usedMemory = -1L;<a name="line.1346"></a>
<span class="sourceLineNo">1347</span>    long maxMemory = -1L;<a name="line.1347"></a>
<span class="sourceLineNo">1348</span>    final MemoryUsage usage = MemorySizeUtil.safeGetHeapMemoryUsage();<a name="line.1348"></a>
<span class="sourceLineNo">1349</span>    if (usage != null) {<a name="line.1349"></a>
<span class="sourceLineNo">1350</span>      usedMemory = usage.getUsed();<a name="line.1350"></a>
<span class="sourceLineNo">1351</span>      maxMemory = usage.getMax();<a name="line.1351"></a>
<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
<span class="sourceLineNo">1353</span><a name="line.1353"></a>
<span class="sourceLineNo">1354</span>    ClusterStatusProtos.ServerLoad.Builder serverLoad = ClusterStatusProtos.ServerLoad.newBuilder();<a name="line.1354"></a>
<span class="sourceLineNo">1355</span>    serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());<a name="line.1355"></a>
<span class="sourceLineNo">1356</span>    serverLoad.setTotalNumberOfRequests(regionServerWrapper.getTotalRequestCount());<a name="line.1356"></a>
<span class="sourceLineNo">1357</span>    serverLoad.setUsedHeapMB((int)(usedMemory / 1024 / 1024));<a name="line.1357"></a>
<span class="sourceLineNo">1358</span>    serverLoad.setMaxHeapMB((int) (maxMemory / 1024 / 1024));<a name="line.1358"></a>
<span class="sourceLineNo">1359</span>    Set&lt;String&gt; coprocessors = getWAL(null).getCoprocessorHost().getCoprocessors();<a name="line.1359"></a>
<span class="sourceLineNo">1360</span>    Builder coprocessorBuilder = Coprocessor.newBuilder();<a name="line.1360"></a>
<span class="sourceLineNo">1361</span>    for (String coprocessor : coprocessors) {<a name="line.1361"></a>
<span class="sourceLineNo">1362</span>      serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1362"></a>
<span class="sourceLineNo">1363</span>    }<a name="line.1363"></a>
<span class="sourceLineNo">1364</span>    RegionLoad.Builder regionLoadBldr = RegionLoad.newBuilder();<a name="line.1364"></a>
<span class="sourceLineNo">1365</span>    RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1365"></a>
<span class="sourceLineNo">1366</span>    for (HRegion region : regions) {<a name="line.1366"></a>
<span class="sourceLineNo">1367</span>      if (region.getCoprocessorHost() != null) {<a name="line.1367"></a>
<span class="sourceLineNo">1368</span>        Set&lt;String&gt; regionCoprocessors = region.getCoprocessorHost().getCoprocessors();<a name="line.1368"></a>
<span class="sourceLineNo">1369</span>        for (String regionCoprocessor : regionCoprocessors) {<a name="line.1369"></a>
<span class="sourceLineNo">1370</span>          serverLoad.addCoprocessors(coprocessorBuilder.setName(regionCoprocessor).build());<a name="line.1370"></a>
<span class="sourceLineNo">1371</span>        }<a name="line.1371"></a>
<span class="sourceLineNo">1372</span>      }<a name="line.1372"></a>
<span class="sourceLineNo">1373</span>      serverLoad.addRegionLoads(createRegionLoad(region, regionLoadBldr, regionSpecifier));<a name="line.1373"></a>
<span class="sourceLineNo">1374</span>      for (String coprocessor : getWAL(region.getRegionInfo()).getCoprocessorHost()<a name="line.1374"></a>
<span class="sourceLineNo">1375</span>          .getCoprocessors()) {<a name="line.1375"></a>
<span class="sourceLineNo">1376</span>        serverLoad.addCoprocessors(coprocessorBuilder.setName(coprocessor).build());<a name="line.1376"></a>
<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
<span class="sourceLineNo">1379</span>    serverLoad.setReportStartTime(reportStartTime);<a name="line.1379"></a>
<span class="sourceLineNo">1380</span>    serverLoad.setReportEndTime(reportEndTime);<a name="line.1380"></a>
<span class="sourceLineNo">1381</span>    if (this.infoServer != null) {<a name="line.1381"></a>
<span class="sourceLineNo">1382</span>      serverLoad.setInfoServerPort(this.infoServer.getPort());<a name="line.1382"></a>
<span class="sourceLineNo">1383</span>    } else {<a name="line.1383"></a>
<span class="sourceLineNo">1384</span>      serverLoad.setInfoServerPort(-1);<a name="line.1384"></a>
<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
<span class="sourceLineNo">1386</span>    MetricsUserAggregateSource userSource =<a name="line.1386"></a>
<span class="sourceLineNo">1387</span>        metricsRegionServer.getMetricsUserAggregate().getSource();<a name="line.1387"></a>
<span class="sourceLineNo">1388</span>    if (userSource != null) {<a name="line.1388"></a>
<span class="sourceLineNo">1389</span>      Map&lt;String, MetricsUserSource&gt; userMetricMap = userSource.getUserSources();<a name="line.1389"></a>
<span class="sourceLineNo">1390</span>      for (Entry&lt;String, MetricsUserSource&gt; entry : userMetricMap.entrySet()) {<a name="line.1390"></a>
<span class="sourceLineNo">1391</span>        serverLoad.addUserLoads(createUserLoad(entry.getKey(), entry.getValue()));<a name="line.1391"></a>
<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
<span class="sourceLineNo">1393</span>    }<a name="line.1393"></a>
<span class="sourceLineNo">1394</span><a name="line.1394"></a>
<span class="sourceLineNo">1395</span>    if (sameReplicationSourceAndSink &amp;&amp; replicationSourceHandler != null) {<a name="line.1395"></a>
<span class="sourceLineNo">1396</span>      // always refresh first to get the latest value<a name="line.1396"></a>
<span class="sourceLineNo">1397</span>      ReplicationLoad rLoad = replicationSourceHandler.refreshAndGetReplicationLoad();<a name="line.1397"></a>
<span class="sourceLineNo">1398</span>      if (rLoad != null) {<a name="line.1398"></a>
<span class="sourceLineNo">1399</span>        serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1399"></a>
<span class="sourceLineNo">1400</span>        for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad<a name="line.1400"></a>
<span class="sourceLineNo">1401</span>          .getReplicationLoadSourceEntries()) {<a name="line.1401"></a>
<span class="sourceLineNo">1402</span>          serverLoad.addReplLoadSource(rLS);<a name="line.1402"></a>
<span class="sourceLineNo">1403</span>        }<a name="line.1403"></a>
<span class="sourceLineNo">1404</span>      }<a name="line.1404"></a>
<span class="sourceLineNo">1405</span>    } else {<a name="line.1405"></a>
<span class="sourceLineNo">1406</span>      if (replicationSourceHandler != null) {<a name="line.1406"></a>
<span class="sourceLineNo">1407</span>        ReplicationLoad rLoad = replicationSourceHandler.refreshAndGetReplicationLoad();<a name="line.1407"></a>
<span class="sourceLineNo">1408</span>        if (rLoad != null) {<a name="line.1408"></a>
<span class="sourceLineNo">1409</span>          for (ClusterStatusProtos.ReplicationLoadSource rLS : rLoad<a name="line.1409"></a>
<span class="sourceLineNo">1410</span>            .getReplicationLoadSourceEntries()) {<a name="line.1410"></a>
<span class="sourceLineNo">1411</span>            serverLoad.addReplLoadSource(rLS);<a name="line.1411"></a>
<span class="sourceLineNo">1412</span>          }<a name="line.1412"></a>
<span class="sourceLineNo">1413</span>        }<a name="line.1413"></a>
<span class="sourceLineNo">1414</span>      }<a name="line.1414"></a>
<span class="sourceLineNo">1415</span>      if (replicationSinkHandler != null) {<a name="line.1415"></a>
<span class="sourceLineNo">1416</span>        ReplicationLoad rLoad = replicationSinkHandler.refreshAndGetReplicationLoad();<a name="line.1416"></a>
<span class="sourceLineNo">1417</span>        if (rLoad != null) {<a name="line.1417"></a>
<span class="sourceLineNo">1418</span>          serverLoad.setReplLoadSink(rLoad.getReplicationLoadSink());<a name="line.1418"></a>
<span class="sourceLineNo">1419</span>        }<a name="line.1419"></a>
<span class="sourceLineNo">1420</span>      }<a name="line.1420"></a>
<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
<span class="sourceLineNo">1422</span><a name="line.1422"></a>
<span class="sourceLineNo">1423</span>    return serverLoad.build();<a name="line.1423"></a>
<span class="sourceLineNo">1424</span>  }<a name="line.1424"></a>
<span class="sourceLineNo">1425</span><a name="line.1425"></a>
<span class="sourceLineNo">1426</span>  private String getOnlineRegionsAsPrintableString() {<a name="line.1426"></a>
<span class="sourceLineNo">1427</span>    StringBuilder sb = new StringBuilder();<a name="line.1427"></a>
<span class="sourceLineNo">1428</span>    for (Region r: this.onlineRegions.values()) {<a name="line.1428"></a>
<span class="sourceLineNo">1429</span>      if (sb.length() &gt; 0) sb.append(", ");<a name="line.1429"></a>
<span class="sourceLineNo">1430</span>      sb.append(r.getRegionInfo().getEncodedName());<a name="line.1430"></a>
<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
<span class="sourceLineNo">1432</span>    return sb.toString();<a name="line.1432"></a>
<span class="sourceLineNo">1433</span>  }<a name="line.1433"></a>
<span class="sourceLineNo">1434</span><a name="line.1434"></a>
<span class="sourceLineNo">1435</span>  /**<a name="line.1435"></a>
<span class="sourceLineNo">1436</span>   * Wait on regions close.<a name="line.1436"></a>
<span class="sourceLineNo">1437</span>   */<a name="line.1437"></a>
<span class="sourceLineNo">1438</span>  private void waitOnAllRegionsToClose(final boolean abort) {<a name="line.1438"></a>
<span class="sourceLineNo">1439</span>    // Wait till all regions are closed before going out.<a name="line.1439"></a>
<span class="sourceLineNo">1440</span>    int lastCount = -1;<a name="line.1440"></a>
<span class="sourceLineNo">1441</span>    long previousLogTime = 0;<a name="line.1441"></a>
<span class="sourceLineNo">1442</span>    Set&lt;String&gt; closedRegions = new HashSet&lt;&gt;();<a name="line.1442"></a>
<span class="sourceLineNo">1443</span>    boolean interrupted = false;<a name="line.1443"></a>
<span class="sourceLineNo">1444</span>    try {<a name="line.1444"></a>
<span class="sourceLineNo">1445</span>      while (!onlineRegions.isEmpty()) {<a name="line.1445"></a>
<span class="sourceLineNo">1446</span>        int count = getNumberOfOnlineRegions();<a name="line.1446"></a>
<span class="sourceLineNo">1447</span>        // Only print a message if the count of regions has changed.<a name="line.1447"></a>
<span class="sourceLineNo">1448</span>        if (count != lastCount) {<a name="line.1448"></a>
<span class="sourceLineNo">1449</span>          // Log every second at most<a name="line.1449"></a>
<span class="sourceLineNo">1450</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.1450"></a>
<span class="sourceLineNo">1451</span>            previousLogTime = System.currentTimeMillis();<a name="line.1451"></a>
<span class="sourceLineNo">1452</span>            lastCount = count;<a name="line.1452"></a>
<span class="sourceLineNo">1453</span>            LOG.info("Waiting on " + count + " regions to close");<a name="line.1453"></a>
<span class="sourceLineNo">1454</span>            // Only print out regions still closing if a small number else will<a name="line.1454"></a>
<span class="sourceLineNo">1455</span>            // swamp the log.<a name="line.1455"></a>
<span class="sourceLineNo">1456</span>            if (count &lt; 10 &amp;&amp; LOG.isDebugEnabled()) {<a name="line.1456"></a>
<span class="sourceLineNo">1457</span>              LOG.debug("Online Regions=" + this.onlineRegions);<a name="line.1457"></a>
<span class="sourceLineNo">1458</span>            }<a name="line.1458"></a>
<span class="sourceLineNo">1459</span>          }<a name="line.1459"></a>
<span class="sourceLineNo">1460</span>        }<a name="line.1460"></a>
<span class="sourceLineNo">1461</span>        // Ensure all user regions have been sent a close. Use this to<a name="line.1461"></a>
<span class="sourceLineNo">1462</span>        // protect against the case where an open comes in after we start the<a name="line.1462"></a>
<span class="sourceLineNo">1463</span>        // iterator of onlineRegions to close all user regions.<a name="line.1463"></a>
<span class="sourceLineNo">1464</span>        for (Map.Entry&lt;String, HRegion&gt; e : this.onlineRegions.entrySet()) {<a name="line.1464"></a>
<span class="sourceLineNo">1465</span>          RegionInfo hri = e.getValue().getRegionInfo();<a name="line.1465"></a>
<span class="sourceLineNo">1466</span>          if (!this.regionsInTransitionInRS.containsKey(hri.getEncodedNameAsBytes()) &amp;&amp;<a name="line.1466"></a>
<span class="sourceLineNo">1467</span>              !closedRegions.contains(hri.getEncodedName())) {<a name="line.1467"></a>
<span class="sourceLineNo">1468</span>            closedRegions.add(hri.getEncodedName());<a name="line.1468"></a>
<span class="sourceLineNo">1469</span>            // Don't update zk with this close transition; pass false.<a name="line.1469"></a>
<span class="sourceLineNo">1470</span>            closeRegionIgnoreErrors(hri, abort);<a name="line.1470"></a>
<span class="sourceLineNo">1471</span>          }<a name="line.1471"></a>
<span class="sourceLineNo">1472</span>        }<a name="line.1472"></a>
<span class="sourceLineNo">1473</span>        // No regions in RIT, we could stop waiting now.<a name="line.1473"></a>
<span class="sourceLineNo">1474</span>        if (this.regionsInTransitionInRS.isEmpty()) {<a name="line.1474"></a>
<span class="sourceLineNo">1475</span>          if (!onlineRegions.isEmpty()) {<a name="line.1475"></a>
<span class="sourceLineNo">1476</span>            LOG.info("We were exiting though online regions are not empty," +<a name="line.1476"></a>
<span class="sourceLineNo">1477</span>                " because some regions failed closing");<a name="line.1477"></a>
<span class="sourceLineNo">1478</span>          }<a name="line.1478"></a>
<span class="sourceLineNo">1479</span>          break;<a name="line.1479"></a>
<span class="sourceLineNo">1480</span>        } else {<a name="line.1480"></a>
<span class="sourceLineNo">1481</span>          LOG.debug("Waiting on {}", this.regionsInTransitionInRS.keySet().stream().<a name="line.1481"></a>
<span class="sourceLineNo">1482</span>            map(e -&gt; Bytes.toString(e)).collect(Collectors.joining(", ")));<a name="line.1482"></a>
<span class="sourceLineNo">1483</span>        }<a name="line.1483"></a>
<span class="sourceLineNo">1484</span>        if (sleepInterrupted(200)) {<a name="line.1484"></a>
<span class="sourceLineNo">1485</span>          interrupted = true;<a name="line.1485"></a>
<span class="sourceLineNo">1486</span>        }<a name="line.1486"></a>
<span class="sourceLineNo">1487</span>      }<a name="line.1487"></a>
<span class="sourceLineNo">1488</span>    } finally {<a name="line.1488"></a>
<span class="sourceLineNo">1489</span>      if (interrupted) {<a name="line.1489"></a>
<span class="sourceLineNo">1490</span>        Thread.currentThread().interrupt();<a name="line.1490"></a>
<span class="sourceLineNo">1491</span>      }<a name="line.1491"></a>
<span class="sourceLineNo">1492</span>    }<a name="line.1492"></a>
<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
<span class="sourceLineNo">1494</span><a name="line.1494"></a>
<span class="sourceLineNo">1495</span>  private static boolean sleepInterrupted(long millis) {<a name="line.1495"></a>
<span class="sourceLineNo">1496</span>    boolean interrupted = false;<a name="line.1496"></a>
<span class="sourceLineNo">1497</span>    try {<a name="line.1497"></a>
<span class="sourceLineNo">1498</span>      Thread.sleep(millis);<a name="line.1498"></a>
<span class="sourceLineNo">1499</span>    } catch (InterruptedException e) {<a name="line.1499"></a>
<span class="sourceLineNo">1500</span>      LOG.warn("Interrupted while sleeping");<a name="line.1500"></a>
<span class="sourceLineNo">1501</span>      interrupted = true;<a name="line.1501"></a>
<span class="sourceLineNo">1502</span>    }<a name="line.1502"></a>
<span class="sourceLineNo">1503</span>    return interrupted;<a name="line.1503"></a>
<span class="sourceLineNo">1504</span>  }<a name="line.1504"></a>
<span class="sourceLineNo">1505</span><a name="line.1505"></a>
<span class="sourceLineNo">1506</span>  private void shutdownWAL(final boolean close) {<a name="line.1506"></a>
<span class="sourceLineNo">1507</span>    if (this.walFactory != null) {<a name="line.1507"></a>
<span class="sourceLineNo">1508</span>      try {<a name="line.1508"></a>
<span class="sourceLineNo">1509</span>        if (close) {<a name="line.1509"></a>
<span class="sourceLineNo">1510</span>          walFactory.close();<a name="line.1510"></a>
<span class="sourceLineNo">1511</span>        } else {<a name="line.1511"></a>
<span class="sourceLineNo">1512</span>          walFactory.shutdown();<a name="line.1512"></a>
<span class="sourceLineNo">1513</span>        }<a name="line.1513"></a>
<span class="sourceLineNo">1514</span>      } catch (Throwable e) {<a name="line.1514"></a>
<span class="sourceLineNo">1515</span>        e = e instanceof RemoteException ? ((RemoteException) e).unwrapRemoteException() : e;<a name="line.1515"></a>
<span class="sourceLineNo">1516</span>        LOG.error("Shutdown / close of WAL failed: " + e);<a name="line.1516"></a>
<span class="sourceLineNo">1517</span>        LOG.debug("Shutdown / close exception details:", e);<a name="line.1517"></a>
<span class="sourceLineNo">1518</span>      }<a name="line.1518"></a>
<span class="sourceLineNo">1519</span>    }<a name="line.1519"></a>
<span class="sourceLineNo">1520</span>  }<a name="line.1520"></a>
<span class="sourceLineNo">1521</span><a name="line.1521"></a>
<span class="sourceLineNo">1522</span>  /**<a name="line.1522"></a>
<span class="sourceLineNo">1523</span>   * get NamedQueue Provider to add different logs to ringbuffer<a name="line.1523"></a>
<span class="sourceLineNo">1524</span>   *<a name="line.1524"></a>
<span class="sourceLineNo">1525</span>   * @return NamedQueueRecorder<a name="line.1525"></a>
<span class="sourceLineNo">1526</span>   */<a name="line.1526"></a>
<span class="sourceLineNo">1527</span>  public NamedQueueRecorder getNamedQueueRecorder() {<a name="line.1527"></a>
<span class="sourceLineNo">1528</span>    return this.namedQueueRecorder;<a name="line.1528"></a>
<span class="sourceLineNo">1529</span>  }<a name="line.1529"></a>
<span class="sourceLineNo">1530</span><a name="line.1530"></a>
<span class="sourceLineNo">1531</span>  /*<a name="line.1531"></a>
<span class="sourceLineNo">1532</span>   * Run init. Sets up wal and starts up all server threads.<a name="line.1532"></a>
<span class="sourceLineNo">1533</span>   *<a name="line.1533"></a>
<span class="sourceLineNo">1534</span>   * @param c Extra configuration.<a name="line.1534"></a>
<span class="sourceLineNo">1535</span>   */<a name="line.1535"></a>
<span class="sourceLineNo">1536</span>  protected void handleReportForDutyResponse(final RegionServerStartupResponse c)<a name="line.1536"></a>
<span class="sourceLineNo">1537</span>  throws IOException {<a name="line.1537"></a>
<span class="sourceLineNo">1538</span>    try {<a name="line.1538"></a>
<span class="sourceLineNo">1539</span>      boolean updateRootDir = false;<a name="line.1539"></a>
<span class="sourceLineNo">1540</span>      for (NameStringPair e : c.getMapEntriesList()) {<a name="line.1540"></a>
<span class="sourceLineNo">1541</span>        String key = e.getName();<a name="line.1541"></a>
<span class="sourceLineNo">1542</span>        // The hostname the master sees us as.<a name="line.1542"></a>
<span class="sourceLineNo">1543</span>        if (key.equals(HConstants.KEY_FOR_HOSTNAME_SEEN_BY_MASTER)) {<a name="line.1543"></a>
<span class="sourceLineNo">1544</span>          String hostnameFromMasterPOV = e.getValue();<a name="line.1544"></a>
<span class="sourceLineNo">1545</span>          this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(),<a name="line.1545"></a>
<span class="sourceLineNo">1546</span>              this.startcode);<a name="line.1546"></a>
<span class="sourceLineNo">1547</span>          if (!StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1547"></a>
<span class="sourceLineNo">1548</span>              !hostnameFromMasterPOV.equals(useThisHostnameInstead)) {<a name="line.1548"></a>
<span class="sourceLineNo">1549</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1549"></a>
<span class="sourceLineNo">1550</span>                this.useThisHostnameInstead + ", but now=" + hostnameFromMasterPOV;<a name="line.1550"></a>
<span class="sourceLineNo">1551</span>            LOG.error(msg);<a name="line.1551"></a>
<span class="sourceLineNo">1552</span>            throw new IOException(msg);<a name="line.1552"></a>
<span class="sourceLineNo">1553</span>          }<a name="line.1553"></a>
<span class="sourceLineNo">1554</span>          if (StringUtils.isBlank(useThisHostnameInstead) &amp;&amp;<a name="line.1554"></a>
<span class="sourceLineNo">1555</span>              !hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) {<a name="line.1555"></a>
<span class="sourceLineNo">1556</span>            String msg = "Master passed us a different hostname to use; was=" +<a name="line.1556"></a>
<span class="sourceLineNo">1557</span>                rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV;<a name="line.1557"></a>
<span class="sourceLineNo">1558</span>            LOG.error(msg);<a name="line.1558"></a>
<span class="sourceLineNo">1559</span>          }<a name="line.1559"></a>
<span class="sourceLineNo">1560</span>          continue;<a name="line.1560"></a>
<span class="sourceLineNo">1561</span>        }<a name="line.1561"></a>
<span class="sourceLineNo">1562</span><a name="line.1562"></a>
<span class="sourceLineNo">1563</span>        String value = e.getValue();<a name="line.1563"></a>
<span class="sourceLineNo">1564</span>        if (key.equals(HConstants.HBASE_DIR)) {<a name="line.1564"></a>
<span class="sourceLineNo">1565</span>          if (value != null &amp;&amp; !value.equals(conf.get(HConstants.HBASE_DIR))) {<a name="line.1565"></a>
<span class="sourceLineNo">1566</span>            updateRootDir = true;<a name="line.1566"></a>
<span class="sourceLineNo">1567</span>          }<a name="line.1567"></a>
<span class="sourceLineNo">1568</span>        }<a name="line.1568"></a>
<span class="sourceLineNo">1569</span><a name="line.1569"></a>
<span class="sourceLineNo">1570</span>        if (LOG.isDebugEnabled()) {<a name="line.1570"></a>
<span class="sourceLineNo">1571</span>          LOG.debug("Config from master: " + key + "=" + value);<a name="line.1571"></a>
<span class="sourceLineNo">1572</span>        }<a name="line.1572"></a>
<span class="sourceLineNo">1573</span>        this.conf.set(key, value);<a name="line.1573"></a>
<span class="sourceLineNo">1574</span>      }<a name="line.1574"></a>
<span class="sourceLineNo">1575</span>      // Set our ephemeral znode up in zookeeper now we have a name.<a name="line.1575"></a>
<span class="sourceLineNo">1576</span>      createMyEphemeralNode();<a name="line.1576"></a>
<span class="sourceLineNo">1577</span><a name="line.1577"></a>
<span class="sourceLineNo">1578</span>      if (updateRootDir) {<a name="line.1578"></a>
<span class="sourceLineNo">1579</span>        // initialize file system by the config fs.defaultFS and hbase.rootdir from master<a name="line.1579"></a>
<span class="sourceLineNo">1580</span>        initializeFileSystem();<a name="line.1580"></a>
<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
<span class="sourceLineNo">1582</span><a name="line.1582"></a>
<span class="sourceLineNo">1583</span>      // hack! Maps DFSClient =&gt; RegionServer for logs.  HDFS made this<a name="line.1583"></a>
<span class="sourceLineNo">1584</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.1584"></a>
<span class="sourceLineNo">1585</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.1585"></a>
<span class="sourceLineNo">1586</span>        this.conf.set("mapreduce.task.attempt.id", "hb_rs_" + this.serverName.toString());<a name="line.1586"></a>
<span class="sourceLineNo">1587</span>      }<a name="line.1587"></a>
<span class="sourceLineNo">1588</span><a name="line.1588"></a>
<span class="sourceLineNo">1589</span>      // Save it in a file, this will allow to see if we crash<a name="line.1589"></a>
<span class="sourceLineNo">1590</span>      ZNodeClearer.writeMyEphemeralNodeOnDisk(getMyEphemeralNodePath());<a name="line.1590"></a>
<span class="sourceLineNo">1591</span><a name="line.1591"></a>
<span class="sourceLineNo">1592</span>      // This call sets up an initialized replication and WAL. Later we start it up.<a name="line.1592"></a>
<span class="sourceLineNo">1593</span>      setupWALAndReplication();<a name="line.1593"></a>
<span class="sourceLineNo">1594</span>      // Init in here rather than in constructor after thread name has been set<a name="line.1594"></a>
<span class="sourceLineNo">1595</span>      final MetricsTable metricsTable =<a name="line.1595"></a>
<span class="sourceLineNo">1596</span>          new MetricsTable(new MetricsTableWrapperAggregateImpl(this));<a name="line.1596"></a>
<span class="sourceLineNo">1597</span>      this.metricsRegionServerImpl = new MetricsRegionServerWrapperImpl(this);<a name="line.1597"></a>
<span class="sourceLineNo">1598</span>      this.metricsRegionServer = new MetricsRegionServer(<a name="line.1598"></a>
<span class="sourceLineNo">1599</span>          metricsRegionServerImpl, conf, metricsTable);<a name="line.1599"></a>
<span class="sourceLineNo">1600</span>      // Now that we have a metrics source, start the pause monitor<a name="line.1600"></a>
<span class="sourceLineNo">1601</span>      this.pauseMonitor = new JvmPauseMonitor(conf, getMetrics().getMetricsSource());<a name="line.1601"></a>
<span class="sourceLineNo">1602</span>      pauseMonitor.start();<a name="line.1602"></a>
<span class="sourceLineNo">1603</span><a name="line.1603"></a>
<span class="sourceLineNo">1604</span>      // There is a rare case where we do NOT want services to start. Check config.<a name="line.1604"></a>
<span class="sourceLineNo">1605</span>      if (getConfiguration().getBoolean("hbase.regionserver.workers", true)) {<a name="line.1605"></a>
<span class="sourceLineNo">1606</span>        startServices();<a name="line.1606"></a>
<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
<span class="sourceLineNo">1608</span>      // In here we start up the replication Service. Above we initialized it. TODO. Reconcile.<a name="line.1608"></a>
<span class="sourceLineNo">1609</span>      // or make sense of it.<a name="line.1609"></a>
<span class="sourceLineNo">1610</span>      startReplicationService();<a name="line.1610"></a>
<span class="sourceLineNo">1611</span><a name="line.1611"></a>
<span class="sourceLineNo">1612</span><a name="line.1612"></a>
<span class="sourceLineNo">1613</span>      // Set up ZK<a name="line.1613"></a>
<span class="sourceLineNo">1614</span>      LOG.info("Serving as " + this.serverName + ", RpcServer on " + rpcServices.isa +<a name="line.1614"></a>
<span class="sourceLineNo">1615</span>          ", sessionid=0x" +<a name="line.1615"></a>
<span class="sourceLineNo">1616</span>          Long.toHexString(this.zooKeeper.getRecoverableZooKeeper().getSessionId()));<a name="line.1616"></a>
<span class="sourceLineNo">1617</span><a name="line.1617"></a>
<span class="sourceLineNo">1618</span>      // Wake up anyone waiting for this server to online<a name="line.1618"></a>
<span class="sourceLineNo">1619</span>      synchronized (online) {<a name="line.1619"></a>
<span class="sourceLineNo">1620</span>        online.set(true);<a name="line.1620"></a>
<span class="sourceLineNo">1621</span>        online.notifyAll();<a name="line.1621"></a>
<span class="sourceLineNo">1622</span>      }<a name="line.1622"></a>
<span class="sourceLineNo">1623</span>    } catch (Throwable e) {<a name="line.1623"></a>
<span class="sourceLineNo">1624</span>      stop("Failed initialization");<a name="line.1624"></a>
<span class="sourceLineNo">1625</span>      throw convertThrowableToIOE(cleanup(e, "Failed init"),<a name="line.1625"></a>
<span class="sourceLineNo">1626</span>          "Region server startup failed");<a name="line.1626"></a>
<span class="sourceLineNo">1627</span>    } finally {<a name="line.1627"></a>
<span class="sourceLineNo">1628</span>      sleeper.skipSleepCycle();<a name="line.1628"></a>
<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
<span class="sourceLineNo">1630</span>  }<a name="line.1630"></a>
<span class="sourceLineNo">1631</span><a name="line.1631"></a>
<span class="sourceLineNo">1632</span>  protected void initializeMemStoreChunkCreator() {<a name="line.1632"></a>
<span class="sourceLineNo">1633</span>    if (MemStoreLAB.isEnabled(conf)) {<a name="line.1633"></a>
<span class="sourceLineNo">1634</span>      // MSLAB is enabled. So initialize MemStoreChunkPool<a name="line.1634"></a>
<span class="sourceLineNo">1635</span>      // By this time, the MemstoreFlusher is already initialized. We can get the global limits from<a name="line.1635"></a>
<span class="sourceLineNo">1636</span>      // it.<a name="line.1636"></a>
<span class="sourceLineNo">1637</span>      Pair&lt;Long, MemoryType&gt; pair = MemorySizeUtil.getGlobalMemStoreSize(conf);<a name="line.1637"></a>
<span class="sourceLineNo">1638</span>      long globalMemStoreSize = pair.getFirst();<a name="line.1638"></a>
<span class="sourceLineNo">1639</span>      boolean offheap = this.regionServerAccounting.isOffheap();<a name="line.1639"></a>
<span class="sourceLineNo">1640</span>      // When off heap memstore in use, take full area for chunk pool.<a name="line.1640"></a>
<span class="sourceLineNo">1641</span>      float poolSizePercentage = offheap ? 1.0F :<a name="line.1641"></a>
<span class="sourceLineNo">1642</span>        conf.getFloat(MemStoreLAB.CHUNK_POOL_MAXSIZE_KEY, MemStoreLAB.POOL_MAX_SIZE_DEFAULT);<a name="line.1642"></a>
<span class="sourceLineNo">1643</span>      float initialCountPercentage = conf.getFloat(MemStoreLAB.CHUNK_POOL_INITIALSIZE_KEY,<a name="line.1643"></a>
<span class="sourceLineNo">1644</span>        MemStoreLAB.POOL_INITIAL_SIZE_DEFAULT);<a name="line.1644"></a>
<span class="sourceLineNo">1645</span>      int chunkSize = conf.getInt(MemStoreLAB.CHUNK_SIZE_KEY, MemStoreLAB.CHUNK_SIZE_DEFAULT);<a name="line.1645"></a>
<span class="sourceLineNo">1646</span>      float indexChunkSizePercent = conf.getFloat(MemStoreLAB.INDEX_CHUNK_SIZE_PERCENTAGE_KEY,<a name="line.1646"></a>
<span class="sourceLineNo">1647</span>        MemStoreLAB.INDEX_CHUNK_SIZE_PERCENTAGE_DEFAULT);<a name="line.1647"></a>
<span class="sourceLineNo">1648</span>      // init the chunkCreator<a name="line.1648"></a>
<span class="sourceLineNo">1649</span>      ChunkCreator.initialize(chunkSize, offheap, globalMemStoreSize, poolSizePercentage,<a name="line.1649"></a>
<span class="sourceLineNo">1650</span>        initialCountPercentage, this.hMemManager, indexChunkSizePercent);<a name="line.1650"></a>
<span class="sourceLineNo">1651</span>    }<a name="line.1651"></a>
<span class="sourceLineNo">1652</span>  }<a name="line.1652"></a>
<span class="sourceLineNo">1653</span><a name="line.1653"></a>
<span class="sourceLineNo">1654</span>  private void startHeapMemoryManager() {<a name="line.1654"></a>
<span class="sourceLineNo">1655</span>    if (this.blockCache != null) {<a name="line.1655"></a>
<span class="sourceLineNo">1656</span>      this.hMemManager =<a name="line.1656"></a>
<span class="sourceLineNo">1657</span>          new HeapMemoryManager(this.blockCache, this.cacheFlusher, this, regionServerAccounting);<a name="line.1657"></a>
<span class="sourceLineNo">1658</span>      this.hMemManager.start(getChoreService());<a name="line.1658"></a>
<span class="sourceLineNo">1659</span>    }<a name="line.1659"></a>
<span class="sourceLineNo">1660</span>  }<a name="line.1660"></a>
<span class="sourceLineNo">1661</span><a name="line.1661"></a>
<span class="sourceLineNo">1662</span>  private void createMyEphemeralNode() throws KeeperException {<a name="line.1662"></a>
<span class="sourceLineNo">1663</span>    RegionServerInfo.Builder rsInfo = RegionServerInfo.newBuilder();<a name="line.1663"></a>
<span class="sourceLineNo">1664</span>    rsInfo.setInfoPort(infoServer != null ? infoServer.getPort() : -1);<a name="line.1664"></a>
<span class="sourceLineNo">1665</span>    rsInfo.setVersionInfo(ProtobufUtil.getVersionInfo());<a name="line.1665"></a>
<span class="sourceLineNo">1666</span>    byte[] data = ProtobufUtil.prependPBMagic(rsInfo.build().toByteArray());<a name="line.1666"></a>
<span class="sourceLineNo">1667</span>    ZKUtil.createEphemeralNodeAndWatch(this.zooKeeper, getMyEphemeralNodePath(), data);<a name="line.1667"></a>
<span class="sourceLineNo">1668</span>  }<a name="line.1668"></a>
<span class="sourceLineNo">1669</span><a name="line.1669"></a>
<span class="sourceLineNo">1670</span>  private void deleteMyEphemeralNode() throws KeeperException {<a name="line.1670"></a>
<span class="sourceLineNo">1671</span>    ZKUtil.deleteNode(this.zooKeeper, getMyEphemeralNodePath());<a name="line.1671"></a>
<span class="sourceLineNo">1672</span>  }<a name="line.1672"></a>
<span class="sourceLineNo">1673</span><a name="line.1673"></a>
<span class="sourceLineNo">1674</span>  @Override<a name="line.1674"></a>
<span class="sourceLineNo">1675</span>  public RegionServerAccounting getRegionServerAccounting() {<a name="line.1675"></a>
<span class="sourceLineNo">1676</span>    return regionServerAccounting;<a name="line.1676"></a>
<span class="sourceLineNo">1677</span>  }<a name="line.1677"></a>
<span class="sourceLineNo">1678</span><a name="line.1678"></a>
<span class="sourceLineNo">1679</span>  /**<a name="line.1679"></a>
<span class="sourceLineNo">1680</span>   * @param r Region to get RegionLoad for.<a name="line.1680"></a>
<span class="sourceLineNo">1681</span>   * @param regionLoadBldr the RegionLoad.Builder, can be null<a name="line.1681"></a>
<span class="sourceLineNo">1682</span>   * @param regionSpecifier the RegionSpecifier.Builder, can be null<a name="line.1682"></a>
<span class="sourceLineNo">1683</span>   * @return RegionLoad instance.<a name="line.1683"></a>
<span class="sourceLineNo">1684</span>   */<a name="line.1684"></a>
<span class="sourceLineNo">1685</span>  RegionLoad createRegionLoad(final HRegion r, RegionLoad.Builder regionLoadBldr,<a name="line.1685"></a>
<span class="sourceLineNo">1686</span>      RegionSpecifier.Builder regionSpecifier) throws IOException {<a name="line.1686"></a>
<span class="sourceLineNo">1687</span>    byte[] name = r.getRegionInfo().getRegionName();<a name="line.1687"></a>
<span class="sourceLineNo">1688</span>    int stores = 0;<a name="line.1688"></a>
<span class="sourceLineNo">1689</span>    int storefiles = 0;<a name="line.1689"></a>
<span class="sourceLineNo">1690</span>    int storeRefCount = 0;<a name="line.1690"></a>
<span class="sourceLineNo">1691</span>    int maxCompactedStoreFileRefCount = 0;<a name="line.1691"></a>
<span class="sourceLineNo">1692</span>    int storeUncompressedSizeMB = 0;<a name="line.1692"></a>
<span class="sourceLineNo">1693</span>    int storefileSizeMB = 0;<a name="line.1693"></a>
<span class="sourceLineNo">1694</span>    int memstoreSizeMB = (int) (r.getMemStoreDataSize() / 1024 / 1024);<a name="line.1694"></a>
<span class="sourceLineNo">1695</span>    long storefileIndexSizeKB = 0;<a name="line.1695"></a>
<span class="sourceLineNo">1696</span>    int rootLevelIndexSizeKB = 0;<a name="line.1696"></a>
<span class="sourceLineNo">1697</span>    int totalStaticIndexSizeKB = 0;<a name="line.1697"></a>
<span class="sourceLineNo">1698</span>    int totalStaticBloomSizeKB = 0;<a name="line.1698"></a>
<span class="sourceLineNo">1699</span>    long totalCompactingKVs = 0;<a name="line.1699"></a>
<span class="sourceLineNo">1700</span>    long currentCompactedKVs = 0;<a name="line.1700"></a>
<span class="sourceLineNo">1701</span>    List&lt;HStore&gt; storeList = r.getStores();<a name="line.1701"></a>
<span class="sourceLineNo">1702</span>    stores += storeList.size();<a name="line.1702"></a>
<span class="sourceLineNo">1703</span>    for (HStore store : storeList) {<a name="line.1703"></a>
<span class="sourceLineNo">1704</span>      storefiles += store.getStorefilesCount();<a name="line.1704"></a>
<span class="sourceLineNo">1705</span>      int currentStoreRefCount = store.getStoreRefCount();<a name="line.1705"></a>
<span class="sourceLineNo">1706</span>      storeRefCount += currentStoreRefCount;<a name="line.1706"></a>
<span class="sourceLineNo">1707</span>      int currentMaxCompactedStoreFileRefCount = store.getMaxCompactedStoreFileRefCount();<a name="line.1707"></a>
<span class="sourceLineNo">1708</span>      maxCompactedStoreFileRefCount = Math.max(maxCompactedStoreFileRefCount,<a name="line.1708"></a>
<span class="sourceLineNo">1709</span>        currentMaxCompactedStoreFileRefCount);<a name="line.1709"></a>
<span class="sourceLineNo">1710</span>      storeUncompressedSizeMB += (int) (store.getStoreSizeUncompressed() / 1024 / 1024);<a name="line.1710"></a>
<span class="sourceLineNo">1711</span>      storefileSizeMB += (int) (store.getStorefilesSize() / 1024 / 1024);<a name="line.1711"></a>
<span class="sourceLineNo">1712</span>      //TODO: storefileIndexSizeKB is same with rootLevelIndexSizeKB?<a name="line.1712"></a>
<span class="sourceLineNo">1713</span>      storefileIndexSizeKB += store.getStorefilesRootLevelIndexSize() / 1024;<a name="line.1713"></a>
<span class="sourceLineNo">1714</span>      CompactionProgress progress = store.getCompactionProgress();<a name="line.1714"></a>
<span class="sourceLineNo">1715</span>      if (progress != null) {<a name="line.1715"></a>
<span class="sourceLineNo">1716</span>        totalCompactingKVs += progress.getTotalCompactingKVs();<a name="line.1716"></a>
<span class="sourceLineNo">1717</span>        currentCompactedKVs += progress.currentCompactedKVs;<a name="line.1717"></a>
<span class="sourceLineNo">1718</span>      }<a name="line.1718"></a>
<span class="sourceLineNo">1719</span>      rootLevelIndexSizeKB += (int) (store.getStorefilesRootLevelIndexSize() / 1024);<a name="line.1719"></a>
<span class="sourceLineNo">1720</span>      totalStaticIndexSizeKB += (int) (store.getTotalStaticIndexSize() / 1024);<a name="line.1720"></a>
<span class="sourceLineNo">1721</span>      totalStaticBloomSizeKB += (int) (store.getTotalStaticBloomSize() / 1024);<a name="line.1721"></a>
<span class="sourceLineNo">1722</span>    }<a name="line.1722"></a>
<span class="sourceLineNo">1723</span><a name="line.1723"></a>
<span class="sourceLineNo">1724</span>    HDFSBlocksDistribution hdfsBd = r.getHDFSBlocksDistribution();<a name="line.1724"></a>
<span class="sourceLineNo">1725</span>    float dataLocality = hdfsBd.getBlockLocalityIndex(serverName.getHostname());<a name="line.1725"></a>
<span class="sourceLineNo">1726</span>    float dataLocalityForSsd = hdfsBd.getBlockLocalityIndexForSsd(serverName.getHostname());<a name="line.1726"></a>
<span class="sourceLineNo">1727</span>    long blocksTotalWeight = hdfsBd.getUniqueBlocksTotalWeight();<a name="line.1727"></a>
<span class="sourceLineNo">1728</span>    long blocksLocalWeight = hdfsBd.getBlocksLocalWeight(serverName.getHostname());<a name="line.1728"></a>
<span class="sourceLineNo">1729</span>    long blocksLocalWithSsdWeight = hdfsBd.getBlocksLocalWithSsdWeight(serverName.getHostname());<a name="line.1729"></a>
<span class="sourceLineNo">1730</span>    if (regionLoadBldr == null) {<a name="line.1730"></a>
<span class="sourceLineNo">1731</span>      regionLoadBldr = RegionLoad.newBuilder();<a name="line.1731"></a>
<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
<span class="sourceLineNo">1733</span>    if (regionSpecifier == null) {<a name="line.1733"></a>
<span class="sourceLineNo">1734</span>      regionSpecifier = RegionSpecifier.newBuilder();<a name="line.1734"></a>
<span class="sourceLineNo">1735</span>    }<a name="line.1735"></a>
<span class="sourceLineNo">1736</span>    regionSpecifier.setType(RegionSpecifierType.REGION_NAME);<a name="line.1736"></a>
<span class="sourceLineNo">1737</span>    regionSpecifier.setValue(UnsafeByteOperations.unsafeWrap(name));<a name="line.1737"></a>
<span class="sourceLineNo">1738</span>    regionLoadBldr.setRegionSpecifier(regionSpecifier.build())<a name="line.1738"></a>
<span class="sourceLineNo">1739</span>      .setStores(stores)<a name="line.1739"></a>
<span class="sourceLineNo">1740</span>      .setStorefiles(storefiles)<a name="line.1740"></a>
<span class="sourceLineNo">1741</span>      .setStoreRefCount(storeRefCount)<a name="line.1741"></a>
<span class="sourceLineNo">1742</span>      .setMaxCompactedStoreFileRefCount(maxCompactedStoreFileRefCount)<a name="line.1742"></a>
<span class="sourceLineNo">1743</span>      .setStoreUncompressedSizeMB(storeUncompressedSizeMB)<a name="line.1743"></a>
<span class="sourceLineNo">1744</span>      .setStorefileSizeMB(storefileSizeMB)<a name="line.1744"></a>
<span class="sourceLineNo">1745</span>      .setMemStoreSizeMB(memstoreSizeMB)<a name="line.1745"></a>
<span class="sourceLineNo">1746</span>      .setStorefileIndexSizeKB(storefileIndexSizeKB)<a name="line.1746"></a>
<span class="sourceLineNo">1747</span>      .setRootIndexSizeKB(rootLevelIndexSizeKB)<a name="line.1747"></a>
<span class="sourceLineNo">1748</span>      .setTotalStaticIndexSizeKB(totalStaticIndexSizeKB)<a name="line.1748"></a>
<span class="sourceLineNo">1749</span>      .setTotalStaticBloomSizeKB(totalStaticBloomSizeKB)<a name="line.1749"></a>
<span class="sourceLineNo">1750</span>      .setReadRequestsCount(r.getReadRequestsCount())<a name="line.1750"></a>
<span class="sourceLineNo">1751</span>      .setCpRequestsCount(r.getCpRequestsCount())<a name="line.1751"></a>
<span class="sourceLineNo">1752</span>      .setFilteredReadRequestsCount(r.getFilteredReadRequestsCount())<a name="line.1752"></a>
<span class="sourceLineNo">1753</span>      .setWriteRequestsCount(r.getWriteRequestsCount())<a name="line.1753"></a>
<span class="sourceLineNo">1754</span>      .setTotalCompactingKVs(totalCompactingKVs)<a name="line.1754"></a>
<span class="sourceLineNo">1755</span>      .setCurrentCompactedKVs(currentCompactedKVs)<a name="line.1755"></a>
<span class="sourceLineNo">1756</span>      .setDataLocality(dataLocality)<a name="line.1756"></a>
<span class="sourceLineNo">1757</span>      .setDataLocalityForSsd(dataLocalityForSsd)<a name="line.1757"></a>
<span class="sourceLineNo">1758</span>      .setBlocksLocalWeight(blocksLocalWeight)<a name="line.1758"></a>
<span class="sourceLineNo">1759</span>      .setBlocksLocalWithSsdWeight(blocksLocalWithSsdWeight)<a name="line.1759"></a>
<span class="sourceLineNo">1760</span>      .setBlocksTotalWeight(blocksTotalWeight)<a name="line.1760"></a>
<span class="sourceLineNo">1761</span>      .setLastMajorCompactionTs(r.getOldestHfileTs(true));<a name="line.1761"></a>
<span class="sourceLineNo">1762</span>    r.setCompleteSequenceId(regionLoadBldr);<a name="line.1762"></a>
<span class="sourceLineNo">1763</span><a name="line.1763"></a>
<span class="sourceLineNo">1764</span>    return regionLoadBldr.build();<a name="line.1764"></a>
<span class="sourceLineNo">1765</span>  }<a name="line.1765"></a>
<span class="sourceLineNo">1766</span><a name="line.1766"></a>
<span class="sourceLineNo">1767</span>  private UserLoad createUserLoad(String user, MetricsUserSource userSource) {<a name="line.1767"></a>
<span class="sourceLineNo">1768</span>    UserLoad.Builder userLoadBldr = UserLoad.newBuilder();<a name="line.1768"></a>
<span class="sourceLineNo">1769</span>    userLoadBldr.setUserName(user);<a name="line.1769"></a>
<span class="sourceLineNo">1770</span>    userSource.getClientMetrics().values().stream().map(<a name="line.1770"></a>
<span class="sourceLineNo">1771</span>      clientMetrics -&gt; ClusterStatusProtos.ClientMetrics.newBuilder()<a name="line.1771"></a>
<span class="sourceLineNo">1772</span>            .setHostName(clientMetrics.getHostName())<a name="line.1772"></a>
<span class="sourceLineNo">1773</span>            .setWriteRequestsCount(clientMetrics.getWriteRequestsCount())<a name="line.1773"></a>
<span class="sourceLineNo">1774</span>            .setFilteredRequestsCount(clientMetrics.getFilteredReadRequests())<a name="line.1774"></a>
<span class="sourceLineNo">1775</span>            .setReadRequestsCount(clientMetrics.getReadRequestsCount()).build())<a name="line.1775"></a>
<span class="sourceLineNo">1776</span>        .forEach(userLoadBldr::addClientMetrics);<a name="line.1776"></a>
<span class="sourceLineNo">1777</span>    return userLoadBldr.build();<a name="line.1777"></a>
<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
<span class="sourceLineNo">1779</span><a name="line.1779"></a>
<span class="sourceLineNo">1780</span>  public RegionLoad createRegionLoad(final String encodedRegionName) throws IOException {<a name="line.1780"></a>
<span class="sourceLineNo">1781</span>    HRegion r = onlineRegions.get(encodedRegionName);<a name="line.1781"></a>
<span class="sourceLineNo">1782</span>    return r != null ? createRegionLoad(r, null, null) : null;<a name="line.1782"></a>
<span class="sourceLineNo">1783</span>  }<a name="line.1783"></a>
<span class="sourceLineNo">1784</span><a name="line.1784"></a>
<span class="sourceLineNo">1785</span>  /**<a name="line.1785"></a>
<span class="sourceLineNo">1786</span>   * Inner class that runs on a long period checking if regions need compaction.<a name="line.1786"></a>
<span class="sourceLineNo">1787</span>   */<a name="line.1787"></a>
<span class="sourceLineNo">1788</span>  private static class CompactionChecker extends ScheduledChore {<a name="line.1788"></a>
<span class="sourceLineNo">1789</span>    private final HRegionServer instance;<a name="line.1789"></a>
<span class="sourceLineNo">1790</span>    private final int majorCompactPriority;<a name="line.1790"></a>
<span class="sourceLineNo">1791</span>    private final static int DEFAULT_PRIORITY = Integer.MAX_VALUE;<a name="line.1791"></a>
<span class="sourceLineNo">1792</span>    //Iteration is 1-based rather than 0-based so we don't check for compaction<a name="line.1792"></a>
<span class="sourceLineNo">1793</span>    // immediately upon region server startup<a name="line.1793"></a>
<span class="sourceLineNo">1794</span>    private long iteration = 1;<a name="line.1794"></a>
<span class="sourceLineNo">1795</span><a name="line.1795"></a>
<span class="sourceLineNo">1796</span>    CompactionChecker(final HRegionServer h, final int sleepTime, final Stoppable stopper) {<a name="line.1796"></a>
<span class="sourceLineNo">1797</span>      super("CompactionChecker", stopper, sleepTime);<a name="line.1797"></a>
<span class="sourceLineNo">1798</span>      this.instance = h;<a name="line.1798"></a>
<span class="sourceLineNo">1799</span>      LOG.info(this.getName() + " runs every " + Duration.ofMillis(sleepTime));<a name="line.1799"></a>
<span class="sourceLineNo">1800</span><a name="line.1800"></a>
<span class="sourceLineNo">1801</span>      /* MajorCompactPriority is configurable.<a name="line.1801"></a>
<span class="sourceLineNo">1802</span>       * If not set, the compaction will use default priority.<a name="line.1802"></a>
<span class="sourceLineNo">1803</span>       */<a name="line.1803"></a>
<span class="sourceLineNo">1804</span>      this.majorCompactPriority = this.instance.conf.<a name="line.1804"></a>
<span class="sourceLineNo">1805</span>          getInt("hbase.regionserver.compactionChecker.majorCompactPriority",<a name="line.1805"></a>
<span class="sourceLineNo">1806</span>              DEFAULT_PRIORITY);<a name="line.1806"></a>
<span class="sourceLineNo">1807</span>    }<a name="line.1807"></a>
<span class="sourceLineNo">1808</span><a name="line.1808"></a>
<span class="sourceLineNo">1809</span>    @Override<a name="line.1809"></a>
<span class="sourceLineNo">1810</span>    protected void chore() {<a name="line.1810"></a>
<span class="sourceLineNo">1811</span>      for (Region r : this.instance.onlineRegions.values()) {<a name="line.1811"></a>
<span class="sourceLineNo">1812</span>        // Skip compaction if region is read only<a name="line.1812"></a>
<span class="sourceLineNo">1813</span>        if (r == null || r.isReadOnly()) {<a name="line.1813"></a>
<span class="sourceLineNo">1814</span>          continue;<a name="line.1814"></a>
<span class="sourceLineNo">1815</span>        }<a name="line.1815"></a>
<span class="sourceLineNo">1816</span><a name="line.1816"></a>
<span class="sourceLineNo">1817</span>        HRegion hr = (HRegion) r;<a name="line.1817"></a>
<span class="sourceLineNo">1818</span>        for (HStore s : hr.stores.values()) {<a name="line.1818"></a>
<span class="sourceLineNo">1819</span>          try {<a name="line.1819"></a>
<span class="sourceLineNo">1820</span>            long multiplier = s.getCompactionCheckMultiplier();<a name="line.1820"></a>
<span class="sourceLineNo">1821</span>            assert multiplier &gt; 0;<a name="line.1821"></a>
<span class="sourceLineNo">1822</span>            if (iteration % multiplier != 0) {<a name="line.1822"></a>
<span class="sourceLineNo">1823</span>              continue;<a name="line.1823"></a>
<span class="sourceLineNo">1824</span>            }<a name="line.1824"></a>
<span class="sourceLineNo">1825</span>            if (s.needsCompaction()) {<a name="line.1825"></a>
<span class="sourceLineNo">1826</span>              // Queue a compaction. Will recognize if major is needed.<a name="line.1826"></a>
<span class="sourceLineNo">1827</span>              this.instance.compactSplitThread.requestSystemCompaction(hr, s,<a name="line.1827"></a>
<span class="sourceLineNo">1828</span>                getName() + " requests compaction");<a name="line.1828"></a>
<span class="sourceLineNo">1829</span>            } else if (s.shouldPerformMajorCompaction()) {<a name="line.1829"></a>
<span class="sourceLineNo">1830</span>              s.triggerMajorCompaction();<a name="line.1830"></a>
<span class="sourceLineNo">1831</span>              if (majorCompactPriority == DEFAULT_PRIORITY ||<a name="line.1831"></a>
<span class="sourceLineNo">1832</span>                  majorCompactPriority &gt; hr.getCompactPriority()) {<a name="line.1832"></a>
<span class="sourceLineNo">1833</span>                this.instance.compactSplitThread.requestCompaction(hr, s,<a name="line.1833"></a>
<span class="sourceLineNo">1834</span>                    getName() + " requests major compaction; use default priority",<a name="line.1834"></a>
<span class="sourceLineNo">1835</span>                    Store.NO_PRIORITY,<a name="line.1835"></a>
<span class="sourceLineNo">1836</span>                CompactionLifeCycleTracker.DUMMY, null);<a name="line.1836"></a>
<span class="sourceLineNo">1837</span>              } else {<a name="line.1837"></a>
<span class="sourceLineNo">1838</span>                this.instance.compactSplitThread.requestCompaction(hr, s,<a name="line.1838"></a>
<span class="sourceLineNo">1839</span>                    getName() + " requests major compaction; use configured priority",<a name="line.1839"></a>
<span class="sourceLineNo">1840</span>                    this.majorCompactPriority, CompactionLifeCycleTracker.DUMMY, null);<a name="line.1840"></a>
<span class="sourceLineNo">1841</span>              }<a name="line.1841"></a>
<span class="sourceLineNo">1842</span>            }<a name="line.1842"></a>
<span class="sourceLineNo">1843</span>          } catch (IOException e) {<a name="line.1843"></a>
<span class="sourceLineNo">1844</span>            LOG.warn("Failed major compaction check on " + r, e);<a name="line.1844"></a>
<span class="sourceLineNo">1845</span>          }<a name="line.1845"></a>
<span class="sourceLineNo">1846</span>        }<a name="line.1846"></a>
<span class="sourceLineNo">1847</span>      }<a name="line.1847"></a>
<span class="sourceLineNo">1848</span>      iteration = (iteration == Long.MAX_VALUE) ? 0 : (iteration + 1);<a name="line.1848"></a>
<span class="sourceLineNo">1849</span>    }<a name="line.1849"></a>
<span class="sourceLineNo">1850</span>  }<a name="line.1850"></a>
<span class="sourceLineNo">1851</span><a name="line.1851"></a>
<span class="sourceLineNo">1852</span>  private static class PeriodicMemStoreFlusher extends ScheduledChore {<a name="line.1852"></a>
<span class="sourceLineNo">1853</span>    private final HRegionServer server;<a name="line.1853"></a>
<span class="sourceLineNo">1854</span>    private final static int RANGE_OF_DELAY = 5 * 60; // 5 min in seconds<a name="line.1854"></a>
<span class="sourceLineNo">1855</span>    private final static int MIN_DELAY_TIME = 0; // millisec<a name="line.1855"></a>
<span class="sourceLineNo">1856</span>    private final long rangeOfDelayMs;<a name="line.1856"></a>
<span class="sourceLineNo">1857</span><a name="line.1857"></a>
<span class="sourceLineNo">1858</span>    PeriodicMemStoreFlusher(int cacheFlushInterval, final HRegionServer server) {<a name="line.1858"></a>
<span class="sourceLineNo">1859</span>      super("MemstoreFlusherChore", server, cacheFlushInterval);<a name="line.1859"></a>
<span class="sourceLineNo">1860</span>      this.server = server;<a name="line.1860"></a>
<span class="sourceLineNo">1861</span><a name="line.1861"></a>
<span class="sourceLineNo">1862</span>      final long configuredRangeOfDelay = server.getConfiguration().getInt(<a name="line.1862"></a>
<span class="sourceLineNo">1863</span>          "hbase.regionserver.periodicmemstoreflusher.rangeofdelayseconds", RANGE_OF_DELAY);<a name="line.1863"></a>
<span class="sourceLineNo">1864</span>      this.rangeOfDelayMs = TimeUnit.SECONDS.toMillis(configuredRangeOfDelay);<a name="line.1864"></a>
<span class="sourceLineNo">1865</span>    }<a name="line.1865"></a>
<span class="sourceLineNo">1866</span><a name="line.1866"></a>
<span class="sourceLineNo">1867</span>    @Override<a name="line.1867"></a>
<span class="sourceLineNo">1868</span>    protected void chore() {<a name="line.1868"></a>
<span class="sourceLineNo">1869</span>      final StringBuilder whyFlush = new StringBuilder();<a name="line.1869"></a>
<span class="sourceLineNo">1870</span>      for (HRegion r : this.server.onlineRegions.values()) {<a name="line.1870"></a>
<span class="sourceLineNo">1871</span>        if (r == null) continue;<a name="line.1871"></a>
<span class="sourceLineNo">1872</span>        if (r.shouldFlush(whyFlush)) {<a name="line.1872"></a>
<span class="sourceLineNo">1873</span>          FlushRequester requester = server.getFlushRequester();<a name="line.1873"></a>
<span class="sourceLineNo">1874</span>          if (requester != null) {<a name="line.1874"></a>
<span class="sourceLineNo">1875</span>            long randomDelay = RandomUtils.nextLong(0, rangeOfDelayMs) + MIN_DELAY_TIME;<a name="line.1875"></a>
<span class="sourceLineNo">1876</span>            //Throttle the flushes by putting a delay. If we don't throttle, and there<a name="line.1876"></a>
<span class="sourceLineNo">1877</span>            //is a balanced write-load on the regions in a table, we might end up<a name="line.1877"></a>
<span class="sourceLineNo">1878</span>            //overwhelming the filesystem with too many flushes at once.<a name="line.1878"></a>
<span class="sourceLineNo">1879</span>            if (requester.requestDelayedFlush(r, randomDelay)) {<a name="line.1879"></a>
<span class="sourceLineNo">1880</span>              LOG.info("{} requesting flush of {} because {} after random delay {} ms",<a name="line.1880"></a>
<span class="sourceLineNo">1881</span>                  getName(), r.getRegionInfo().getRegionNameAsString(),  whyFlush.toString(),<a name="line.1881"></a>
<span class="sourceLineNo">1882</span>                  randomDelay);<a name="line.1882"></a>
<span class="sourceLineNo">1883</span>            }<a name="line.1883"></a>
<span class="sourceLineNo">1884</span>          }<a name="line.1884"></a>
<span class="sourceLineNo">1885</span>        }<a name="line.1885"></a>
<span class="sourceLineNo">1886</span>      }<a name="line.1886"></a>
<span class="sourceLineNo">1887</span>    }<a name="line.1887"></a>
<span class="sourceLineNo">1888</span>  }<a name="line.1888"></a>
<span class="sourceLineNo">1889</span><a name="line.1889"></a>
<span class="sourceLineNo">1890</span>  /**<a name="line.1890"></a>
<span class="sourceLineNo">1891</span>   * Report the status of the server. A server is online once all the startup is<a name="line.1891"></a>
<span class="sourceLineNo">1892</span>   * completed (setting up filesystem, starting executorService threads, etc.). This<a name="line.1892"></a>
<span class="sourceLineNo">1893</span>   * method is designed mostly to be useful in tests.<a name="line.1893"></a>
<span class="sourceLineNo">1894</span>   *<a name="line.1894"></a>
<span class="sourceLineNo">1895</span>   * @return true if online, false if not.<a name="line.1895"></a>
<span class="sourceLineNo">1896</span>   */<a name="line.1896"></a>
<span class="sourceLineNo">1897</span>  public boolean isOnline() {<a name="line.1897"></a>
<span class="sourceLineNo">1898</span>    return online.get();<a name="line.1898"></a>
<span class="sourceLineNo">1899</span>  }<a name="line.1899"></a>
<span class="sourceLineNo">1900</span><a name="line.1900"></a>
<span class="sourceLineNo">1901</span>  /**<a name="line.1901"></a>
<span class="sourceLineNo">1902</span>   * Setup WAL log and replication if enabled. Replication setup is done in here because it wants to<a name="line.1902"></a>
<span class="sourceLineNo">1903</span>   * be hooked up to WAL.<a name="line.1903"></a>
<span class="sourceLineNo">1904</span>   */<a name="line.1904"></a>
<span class="sourceLineNo">1905</span>  private void setupWALAndReplication() throws IOException {<a name="line.1905"></a>
<span class="sourceLineNo">1906</span>    boolean isMasterNoTableOrSystemTableOnly = this instanceof HMaster &amp;&amp;<a name="line.1906"></a>
<span class="sourceLineNo">1907</span>        !LoadBalancer.isMasterCanHostUserRegions(conf);<a name="line.1907"></a>
<span class="sourceLineNo">1908</span>    WALFactory factory =<a name="line.1908"></a>
<span class="sourceLineNo">1909</span>        new WALFactory(conf, serverName.toString(), !isMasterNoTableOrSystemTableOnly);<a name="line.1909"></a>
<span class="sourceLineNo">1910</span>    if (!isMasterNoTableOrSystemTableOnly) {<a name="line.1910"></a>
<span class="sourceLineNo">1911</span>      // TODO Replication make assumptions here based on the default filesystem impl<a name="line.1911"></a>
<span class="sourceLineNo">1912</span>      Path oldLogDir = new Path(walRootDir, HConstants.HREGION_OLDLOGDIR_NAME);<a name="line.1912"></a>
<span class="sourceLineNo">1913</span>      String logName = AbstractFSWALProvider.getWALDirectoryName(this.serverName.toString());<a name="line.1913"></a>
<span class="sourceLineNo">1914</span><a name="line.1914"></a>
<span class="sourceLineNo">1915</span>      Path logDir = new Path(walRootDir, logName);<a name="line.1915"></a>
<span class="sourceLineNo">1916</span>      LOG.debug("logDir={}", logDir);<a name="line.1916"></a>
<span class="sourceLineNo">1917</span>      if (this.walFs.exists(logDir)) {<a name="line.1917"></a>
<span class="sourceLineNo">1918</span>        throw new RegionServerRunningException(<a name="line.1918"></a>
<span class="sourceLineNo">1919</span>            "Region server has already created directory at " + this.serverName.toString());<a name="line.1919"></a>
<span class="sourceLineNo">1920</span>      }<a name="line.1920"></a>
<span class="sourceLineNo">1921</span>      // Always create wal directory as now we need this when master restarts to find out the live<a name="line.1921"></a>
<span class="sourceLineNo">1922</span>      // region servers.<a name="line.1922"></a>
<span class="sourceLineNo">1923</span>      if (!this.walFs.mkdirs(logDir)) {<a name="line.1923"></a>
<span class="sourceLineNo">1924</span>        throw new IOException("Can not create wal directory " + logDir);<a name="line.1924"></a>
<span class="sourceLineNo">1925</span>      }<a name="line.1925"></a>
<span class="sourceLineNo">1926</span>      // Instantiate replication if replication enabled. Pass it the log directories.<a name="line.1926"></a>
<span class="sourceLineNo">1927</span>      createNewReplicationInstance(conf, this, this.walFs, logDir, oldLogDir,<a name="line.1927"></a>
<span class="sourceLineNo">1928</span>        factory.getWALProvider());<a name="line.1928"></a>
<span class="sourceLineNo">1929</span>    }<a name="line.1929"></a>
<span class="sourceLineNo">1930</span>    this.walFactory = factory;<a name="line.1930"></a>
<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
<span class="sourceLineNo">1932</span><a name="line.1932"></a>
<span class="sourceLineNo">1933</span>  /**<a name="line.1933"></a>
<span class="sourceLineNo">1934</span>   * Start up replication source and sink handlers.<a name="line.1934"></a>
<span class="sourceLineNo">1935</span>   */<a name="line.1935"></a>
<span class="sourceLineNo">1936</span>  private void startReplicationService() throws IOException {<a name="line.1936"></a>
<span class="sourceLineNo">1937</span>    if (sameReplicationSourceAndSink &amp;&amp; this.replicationSourceHandler != null) {<a name="line.1937"></a>
<span class="sourceLineNo">1938</span>      this.replicationSourceHandler.startReplicationService();<a name="line.1938"></a>
<span class="sourceLineNo">1939</span>    } else {<a name="line.1939"></a>
<span class="sourceLineNo">1940</span>      if (this.replicationSourceHandler != null) {<a name="line.1940"></a>
<span class="sourceLineNo">1941</span>        this.replicationSourceHandler.startReplicationService();<a name="line.1941"></a>
<span class="sourceLineNo">1942</span>      }<a name="line.1942"></a>
<span class="sourceLineNo">1943</span>      if (this.replicationSinkHandler != null) {<a name="line.1943"></a>
<span class="sourceLineNo">1944</span>        this.replicationSinkHandler.startReplicationService();<a name="line.1944"></a>
<span class="sourceLineNo">1945</span>      }<a name="line.1945"></a>
<span class="sourceLineNo">1946</span>    }<a name="line.1946"></a>
<span class="sourceLineNo">1947</span>  }<a name="line.1947"></a>
<span class="sourceLineNo">1948</span><a name="line.1948"></a>
<span class="sourceLineNo">1949</span>  /**<a name="line.1949"></a>
<span class="sourceLineNo">1950</span>   * @return Master address tracker instance.<a name="line.1950"></a>
<span class="sourceLineNo">1951</span>   */<a name="line.1951"></a>
<span class="sourceLineNo">1952</span>  public MasterAddressTracker getMasterAddressTracker() {<a name="line.1952"></a>
<span class="sourceLineNo">1953</span>    return this.masterAddressTracker;<a name="line.1953"></a>
<span class="sourceLineNo">1954</span>  }<a name="line.1954"></a>
<span class="sourceLineNo">1955</span><a name="line.1955"></a>
<span class="sourceLineNo">1956</span>  /**<a name="line.1956"></a>
<span class="sourceLineNo">1957</span>   * Start maintenance Threads, Server, Worker and lease checker threads.<a name="line.1957"></a>
<span class="sourceLineNo">1958</span>   * Start all threads we need to run. This is called after we've successfully<a name="line.1958"></a>
<span class="sourceLineNo">1959</span>   * registered with the Master.<a name="line.1959"></a>
<span class="sourceLineNo">1960</span>   * Install an UncaughtExceptionHandler that calls abort of RegionServer if we<a name="line.1960"></a>
<span class="sourceLineNo">1961</span>   * get an unhandled exception. We cannot set the handler on all threads.<a name="line.1961"></a>
<span class="sourceLineNo">1962</span>   * Server's internal Listener thread is off limits. For Server, if an OOME, it<a name="line.1962"></a>
<span class="sourceLineNo">1963</span>   * waits a while then retries. Meantime, a flush or a compaction that tries to<a name="line.1963"></a>
<span class="sourceLineNo">1964</span>   * run should trigger same critical condition and the shutdown will run. On<a name="line.1964"></a>
<span class="sourceLineNo">1965</span>   * its way out, this server will shut down Server. Leases are sort of<a name="line.1965"></a>
<span class="sourceLineNo">1966</span>   * inbetween. It has an internal thread that while it inherits from Chore, it<a name="line.1966"></a>
<span class="sourceLineNo">1967</span>   * keeps its own internal stop mechanism so needs to be stopped by this<a name="line.1967"></a>
<span class="sourceLineNo">1968</span>   * hosting server. Worker logs the exception and exits.<a name="line.1968"></a>
<span class="sourceLineNo">1969</span>   */<a name="line.1969"></a>
<span class="sourceLineNo">1970</span>  private void startServices() throws IOException {<a name="line.1970"></a>
<span class="sourceLineNo">1971</span>    if (!isStopped() &amp;&amp; !isAborted()) {<a name="line.1971"></a>
<span class="sourceLineNo">1972</span>      initializeThreads();<a name="line.1972"></a>
<span class="sourceLineNo">1973</span>    }<a name="line.1973"></a>
<span class="sourceLineNo">1974</span>    this.secureBulkLoadManager = new SecureBulkLoadManager(this.conf, asyncClusterConnection);<a name="line.1974"></a>
<span class="sourceLineNo">1975</span>    this.secureBulkLoadManager.start();<a name="line.1975"></a>
<span class="sourceLineNo">1976</span><a name="line.1976"></a>
<span class="sourceLineNo">1977</span>    // Health checker thread.<a name="line.1977"></a>
<span class="sourceLineNo">1978</span>    if (isHealthCheckerConfigured()) {<a name="line.1978"></a>
<span class="sourceLineNo">1979</span>      int sleepTime = this.conf.getInt(HConstants.HEALTH_CHORE_WAKE_FREQ,<a name="line.1979"></a>
<span class="sourceLineNo">1980</span>      HConstants.DEFAULT_THREAD_WAKE_FREQUENCY);<a name="line.1980"></a>
<span class="sourceLineNo">1981</span>      healthCheckChore = new HealthCheckChore(sleepTime, this, getConfiguration());<a name="line.1981"></a>
<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
<span class="sourceLineNo">1983</span>    // Executor status collect thread.<a name="line.1983"></a>
<span class="sourceLineNo">1984</span>    if (this.conf.getBoolean(HConstants.EXECUTOR_STATUS_COLLECT_ENABLED,<a name="line.1984"></a>
<span class="sourceLineNo">1985</span>        HConstants.DEFAULT_EXECUTOR_STATUS_COLLECT_ENABLED)) {<a name="line.1985"></a>
<span class="sourceLineNo">1986</span>      int sleepTime = this.conf.getInt(ExecutorStatusChore.WAKE_FREQ,<a name="line.1986"></a>
<span class="sourceLineNo">1987</span>          ExecutorStatusChore.DEFAULT_WAKE_FREQ);<a name="line.1987"></a>
<span class="sourceLineNo">1988</span>      executorStatusChore = new ExecutorStatusChore(sleepTime, this, this.getExecutorService(),<a name="line.1988"></a>
<span class="sourceLineNo">1989</span>          this.metricsRegionServer.getMetricsSource());<a name="line.1989"></a>
<span class="sourceLineNo">1990</span>    }<a name="line.1990"></a>
<span class="sourceLineNo">1991</span><a name="line.1991"></a>
<span class="sourceLineNo">1992</span>    this.walRoller = new LogRoller(this);<a name="line.1992"></a>
<span class="sourceLineNo">1993</span>    this.flushThroughputController = FlushThroughputControllerFactory.create(this, conf);<a name="line.1993"></a>
<span class="sourceLineNo">1994</span>    this.procedureResultReporter = new RemoteProcedureResultReporter(this);<a name="line.1994"></a>
<span class="sourceLineNo">1995</span><a name="line.1995"></a>
<span class="sourceLineNo">1996</span>    // Create the CompactedFileDischarger chore executorService. This chore helps to<a name="line.1996"></a>
<span class="sourceLineNo">1997</span>    // remove the compacted files that will no longer be used in reads.<a name="line.1997"></a>
<span class="sourceLineNo">1998</span>    // Default is 2 mins. The default value for TTLCleaner is 5 mins so we set this to<a name="line.1998"></a>
<span class="sourceLineNo">1999</span>    // 2 mins so that compacted files can be archived before the TTLCleaner runs<a name="line.1999"></a>
<span class="sourceLineNo">2000</span>    int cleanerInterval =<a name="line.2000"></a>
<span class="sourceLineNo">2001</span>      conf.getInt("hbase.hfile.compaction.discharger.interval", 2 * 60 * 1000);<a name="line.2001"></a>
<span class="sourceLineNo">2002</span>    this.compactedFileDischarger =<a name="line.2002"></a>
<span class="sourceLineNo">2003</span>      new CompactedHFilesDischarger(cleanerInterval, this, this);<a name="line.2003"></a>
<span class="sourceLineNo">2004</span>    choreService.scheduleChore(compactedFileDischarger);<a name="line.2004"></a>
<span class="sourceLineNo">2005</span><a name="line.2005"></a>
<span class="sourceLineNo">2006</span>    // Start executor services<a name="line.2006"></a>
<span class="sourceLineNo">2007</span>    this.executorService.startExecutorService(ExecutorType.RS_OPEN_REGION,<a name="line.2007"></a>
<span class="sourceLineNo">2008</span>        conf.getInt("hbase.regionserver.executor.openregion.threads", 3));<a name="line.2008"></a>
<span class="sourceLineNo">2009</span>    this.executorService.startExecutorService(ExecutorType.RS_OPEN_META,<a name="line.2009"></a>
<span class="sourceLineNo">2010</span>        conf.getInt("hbase.regionserver.executor.openmeta.threads", 1));<a name="line.2010"></a>
<span class="sourceLineNo">2011</span>    this.executorService.startExecutorService(ExecutorType.RS_OPEN_PRIORITY_REGION,<a name="line.2011"></a>
<span class="sourceLineNo">2012</span>        conf.getInt("hbase.regionserver.executor.openpriorityregion.threads", 3));<a name="line.2012"></a>
<span class="sourceLineNo">2013</span>    this.executorService.startExecutorService(ExecutorType.RS_CLOSE_REGION,<a name="line.2013"></a>
<span class="sourceLineNo">2014</span>        conf.getInt("hbase.regionserver.executor.closeregion.threads", 3));<a name="line.2014"></a>
<span class="sourceLineNo">2015</span>    this.executorService.startExecutorService(ExecutorType.RS_CLOSE_META,<a name="line.2015"></a>
<span class="sourceLineNo">2016</span>        conf.getInt("hbase.regionserver.executor.closemeta.threads", 1));<a name="line.2016"></a>
<span class="sourceLineNo">2017</span>    if (conf.getBoolean(StoreScanner.STORESCANNER_PARALLEL_SEEK_ENABLE, false)) {<a name="line.2017"></a>
<span class="sourceLineNo">2018</span>      this.executorService.startExecutorService(ExecutorType.RS_PARALLEL_SEEK,<a name="line.2018"></a>
<span class="sourceLineNo">2019</span>          conf.getInt("hbase.storescanner.parallel.seek.threads", 10));<a name="line.2019"></a>
<span class="sourceLineNo">2020</span>    }<a name="line.2020"></a>
<span class="sourceLineNo">2021</span>    this.executorService.startExecutorService(ExecutorType.RS_LOG_REPLAY_OPS, conf.getInt(<a name="line.2021"></a>
<span class="sourceLineNo">2022</span>        HBASE_SPLIT_WAL_MAX_SPLITTER, DEFAULT_HBASE_SPLIT_WAL_MAX_SPLITTER));<a name="line.2022"></a>
<span class="sourceLineNo">2023</span>    // Start the threads for compacted files discharger<a name="line.2023"></a>
<span class="sourceLineNo">2024</span>    this.executorService.startExecutorService(ExecutorType.RS_COMPACTED_FILES_DISCHARGER,<a name="line.2024"></a>
<span class="sourceLineNo">2025</span>        conf.getInt(CompactionConfiguration.HBASE_HFILE_COMPACTION_DISCHARGER_THREAD_COUNT, 10));<a name="line.2025"></a>
<span class="sourceLineNo">2026</span>    if (ServerRegionReplicaUtil.isRegionReplicaWaitForPrimaryFlushEnabled(conf)) {<a name="line.2026"></a>
<span class="sourceLineNo">2027</span>      this.executorService.startExecutorService(ExecutorType.RS_REGION_REPLICA_FLUSH_OPS,<a name="line.2027"></a>
<span class="sourceLineNo">2028</span>          conf.getInt("hbase.regionserver.region.replica.flusher.threads",<a name="line.2028"></a>
<span class="sourceLineNo">2029</span>              conf.getInt("hbase.regionserver.executor.openregion.threads", 3)));<a name="line.2029"></a>
<span class="sourceLineNo">2030</span>    }<a name="line.2030"></a>
<span class="sourceLineNo">2031</span>    this.executorService.startExecutorService(ExecutorType.RS_REFRESH_PEER,<a name="line.2031"></a>
<span class="sourceLineNo">2032</span>      conf.getInt("hbase.regionserver.executor.refresh.peer.threads", 2));<a name="line.2032"></a>
<span class="sourceLineNo">2033</span>    this.executorService.startExecutorService(ExecutorType.RS_REPLAY_SYNC_REPLICATION_WAL,<a name="line.2033"></a>
<span class="sourceLineNo">2034</span>      conf.getInt("hbase.regionserver.executor.replay.sync.replication.wal.threads", 1));<a name="line.2034"></a>
<span class="sourceLineNo">2035</span>    this.executorService.startExecutorService(ExecutorType.RS_SWITCH_RPC_THROTTLE,<a name="line.2035"></a>
<span class="sourceLineNo">2036</span>      conf.getInt("hbase.regionserver.executor.switch.rpc.throttle.threads", 1));<a name="line.2036"></a>
<span class="sourceLineNo">2037</span><a name="line.2037"></a>
<span class="sourceLineNo">2038</span>    Threads.setDaemonThreadRunning(this.walRoller, getName() + ".logRoller",<a name="line.2038"></a>
<span class="sourceLineNo">2039</span>        uncaughtExceptionHandler);<a name="line.2039"></a>
<span class="sourceLineNo">2040</span>    if (this.cacheFlusher != null) {<a name="line.2040"></a>
<span class="sourceLineNo">2041</span>      this.cacheFlusher.start(uncaughtExceptionHandler);<a name="line.2041"></a>
<span class="sourceLineNo">2042</span>    }<a name="line.2042"></a>
<span class="sourceLineNo">2043</span>    Threads.setDaemonThreadRunning(this.procedureResultReporter,<a name="line.2043"></a>
<span class="sourceLineNo">2044</span>      getName() + ".procedureResultReporter", uncaughtExceptionHandler);<a name="line.2044"></a>
<span class="sourceLineNo">2045</span><a name="line.2045"></a>
<span class="sourceLineNo">2046</span>    if (this.compactionChecker != null) {<a name="line.2046"></a>
<span class="sourceLineNo">2047</span>      choreService.scheduleChore(compactionChecker);<a name="line.2047"></a>
<span class="sourceLineNo">2048</span>    }<a name="line.2048"></a>
<span class="sourceLineNo">2049</span>    if (this.periodicFlusher != null) {<a name="line.2049"></a>
<span class="sourceLineNo">2050</span>      choreService.scheduleChore(periodicFlusher);<a name="line.2050"></a>
<span class="sourceLineNo">2051</span>    }<a name="line.2051"></a>
<span class="sourceLineNo">2052</span>    if (this.healthCheckChore != null) {<a name="line.2052"></a>
<span class="sourceLineNo">2053</span>      choreService.scheduleChore(healthCheckChore);<a name="line.2053"></a>
<span class="sourceLineNo">2054</span>    }<a name="line.2054"></a>
<span class="sourceLineNo">2055</span>    if (this.executorStatusChore != null) {<a name="line.2055"></a>
<span class="sourceLineNo">2056</span>      choreService.scheduleChore(executorStatusChore);<a name="line.2056"></a>
<span class="sourceLineNo">2057</span>    }<a name="line.2057"></a>
<span class="sourceLineNo">2058</span>    if (this.nonceManagerChore != null) {<a name="line.2058"></a>
<span class="sourceLineNo">2059</span>      choreService.scheduleChore(nonceManagerChore);<a name="line.2059"></a>
<span class="sourceLineNo">2060</span>    }<a name="line.2060"></a>
<span class="sourceLineNo">2061</span>    if (this.storefileRefresher != null) {<a name="line.2061"></a>
<span class="sourceLineNo">2062</span>      choreService.scheduleChore(storefileRefresher);<a name="line.2062"></a>
<span class="sourceLineNo">2063</span>    }<a name="line.2063"></a>
<span class="sourceLineNo">2064</span>    if (this.fsUtilizationChore != null) {<a name="line.2064"></a>
<span class="sourceLineNo">2065</span>      choreService.scheduleChore(fsUtilizationChore);<a name="line.2065"></a>
<span class="sourceLineNo">2066</span>    }<a name="line.2066"></a>
<span class="sourceLineNo">2067</span>    if (this.slowLogTableOpsChore != null) {<a name="line.2067"></a>
<span class="sourceLineNo">2068</span>      choreService.scheduleChore(slowLogTableOpsChore);<a name="line.2068"></a>
<span class="sourceLineNo">2069</span>    }<a name="line.2069"></a>
<span class="sourceLineNo">2070</span><a name="line.2070"></a>
<span class="sourceLineNo">2071</span>    // Leases is not a Thread. Internally it runs a daemon thread. If it gets<a name="line.2071"></a>
<span class="sourceLineNo">2072</span>    // an unhandled exception, it will just exit.<a name="line.2072"></a>
<span class="sourceLineNo">2073</span>    Threads.setDaemonThreadRunning(this.leaseManager, getName() + ".leaseChecker",<a name="line.2073"></a>
<span class="sourceLineNo">2074</span>        uncaughtExceptionHandler);<a name="line.2074"></a>
<span class="sourceLineNo">2075</span><a name="line.2075"></a>
<span class="sourceLineNo">2076</span>    // Create the log splitting worker and start it<a name="line.2076"></a>
<span class="sourceLineNo">2077</span>    // set a smaller retries to fast fail otherwise splitlogworker could be blocked for<a name="line.2077"></a>
<span class="sourceLineNo">2078</span>    // quite a while inside Connection layer. The worker won't be available for other<a name="line.2078"></a>
<span class="sourceLineNo">2079</span>    // tasks even after current task is preempted after a split task times out.<a name="line.2079"></a>
<span class="sourceLineNo">2080</span>    Configuration sinkConf = HBaseConfiguration.create(conf);<a name="line.2080"></a>
<span class="sourceLineNo">2081</span>    sinkConf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.2081"></a>
<span class="sourceLineNo">2082</span>        conf.getInt("hbase.log.replay.retries.number", 8)); // 8 retries take about 23 seconds<a name="line.2082"></a>
<span class="sourceLineNo">2083</span>    sinkConf.setInt(HConstants.HBASE_RPC_TIMEOUT_KEY,<a name="line.2083"></a>
<span class="sourceLineNo">2084</span>        conf.getInt("hbase.log.replay.rpc.timeout", 30000)); // default 30 seconds<a name="line.2084"></a>
<span class="sourceLineNo">2085</span>    sinkConf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.2085"></a>
<span class="sourceLineNo">2086</span>    if (this.csm != null &amp;&amp; conf.getBoolean(HBASE_SPLIT_WAL_COORDINATED_BY_ZK,<a name="line.2086"></a>
<span class="sourceLineNo">2087</span>      DEFAULT_HBASE_SPLIT_COORDINATED_BY_ZK)) {<a name="line.2087"></a>
<span class="sourceLineNo">2088</span>      // SplitLogWorker needs csm. If none, don't start this.<a name="line.2088"></a>
<span class="sourceLineNo">2089</span>      this.splitLogWorker = new SplitLogWorker(sinkConf, this, this, walFactory);<a name="line.2089"></a>
<span class="sourceLineNo">2090</span>      splitLogWorker.start();<a name="line.2090"></a>
<span class="sourceLineNo">2091</span>      LOG.debug("SplitLogWorker started");<a name="line.2091"></a>
<span class="sourceLineNo">2092</span>    }<a name="line.2092"></a>
<span class="sourceLineNo">2093</span><a name="line.2093"></a>
<span class="sourceLineNo">2094</span>    // Memstore services.<a name="line.2094"></a>
<span class="sourceLineNo">2095</span>    startHeapMemoryManager();<a name="line.2095"></a>
<span class="sourceLineNo">2096</span>    // Call it after starting HeapMemoryManager.<a name="line.2096"></a>
<span class="sourceLineNo">2097</span>    initializeMemStoreChunkCreator();<a name="line.2097"></a>
<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
<span class="sourceLineNo">2099</span><a name="line.2099"></a>
<span class="sourceLineNo">2100</span>  private void initializeThreads() {<a name="line.2100"></a>
<span class="sourceLineNo">2101</span>    // Cache flushing thread.<a name="line.2101"></a>
<span class="sourceLineNo">2102</span>    this.cacheFlusher = new MemStoreFlusher(conf, this);<a name="line.2102"></a>
<span class="sourceLineNo">2103</span><a name="line.2103"></a>
<span class="sourceLineNo">2104</span>    // Compaction thread<a name="line.2104"></a>
<span class="sourceLineNo">2105</span>    this.compactSplitThread = new CompactSplit(this);<a name="line.2105"></a>
<span class="sourceLineNo">2106</span><a name="line.2106"></a>
<span class="sourceLineNo">2107</span>    // Background thread to check for compactions; needed if region has not gotten updates<a name="line.2107"></a>
<span class="sourceLineNo">2108</span>    // in a while. It will take care of not checking too frequently on store-by-store basis.<a name="line.2108"></a>
<span class="sourceLineNo">2109</span>    this.compactionChecker = new CompactionChecker(this, this.compactionCheckFrequency, this);<a name="line.2109"></a>
<span class="sourceLineNo">2110</span>    this.periodicFlusher = new PeriodicMemStoreFlusher(this.flushCheckFrequency, this);<a name="line.2110"></a>
<span class="sourceLineNo">2111</span>    this.leaseManager = new LeaseManager(this.threadWakeFrequency);<a name="line.2111"></a>
<span class="sourceLineNo">2112</span><a name="line.2112"></a>
<span class="sourceLineNo">2113</span>    final boolean isSlowLogTableEnabled = conf.getBoolean(HConstants.SLOW_LOG_SYS_TABLE_ENABLED_KEY,<a name="line.2113"></a>
<span class="sourceLineNo">2114</span>      HConstants.DEFAULT_SLOW_LOG_SYS_TABLE_ENABLED_KEY);<a name="line.2114"></a>
<span class="sourceLineNo">2115</span>    if (isSlowLogTableEnabled) {<a name="line.2115"></a>
<span class="sourceLineNo">2116</span>      // default chore duration: 10 min<a name="line.2116"></a>
<span class="sourceLineNo">2117</span>      final int duration = conf.getInt("hbase.slowlog.systable.chore.duration", 10 * 60 * 1000);<a name="line.2117"></a>
<span class="sourceLineNo">2118</span>      slowLogTableOpsChore = new SlowLogTableOpsChore(this, duration, this.namedQueueRecorder);<a name="line.2118"></a>
<span class="sourceLineNo">2119</span>    }<a name="line.2119"></a>
<span class="sourceLineNo">2120</span><a name="line.2120"></a>
<span class="sourceLineNo">2121</span>    if (this.nonceManager != null) {<a name="line.2121"></a>
<span class="sourceLineNo">2122</span>      // Create the scheduled chore that cleans up nonces.<a name="line.2122"></a>
<span class="sourceLineNo">2123</span>      nonceManagerChore = this.nonceManager.createCleanupScheduledChore(this);<a name="line.2123"></a>
<span class="sourceLineNo">2124</span>    }<a name="line.2124"></a>
<span class="sourceLineNo">2125</span><a name="line.2125"></a>
<span class="sourceLineNo">2126</span>    // Setup the Quota Manager<a name="line.2126"></a>
<span class="sourceLineNo">2127</span>    rsQuotaManager = new RegionServerRpcQuotaManager(this);<a name="line.2127"></a>
<span class="sourceLineNo">2128</span>    rsSpaceQuotaManager = new RegionServerSpaceQuotaManager(this);<a name="line.2128"></a>
<span class="sourceLineNo">2129</span><a name="line.2129"></a>
<span class="sourceLineNo">2130</span>    if (QuotaUtil.isQuotaEnabled(conf)) {<a name="line.2130"></a>
<span class="sourceLineNo">2131</span>      this.fsUtilizationChore = new FileSystemUtilizationChore(this);<a name="line.2131"></a>
<span class="sourceLineNo">2132</span>    }<a name="line.2132"></a>
<span class="sourceLineNo">2133</span><a name="line.2133"></a>
<span class="sourceLineNo">2134</span><a name="line.2134"></a>
<span class="sourceLineNo">2135</span>    boolean onlyMetaRefresh = false;<a name="line.2135"></a>
<span class="sourceLineNo">2136</span>    int storefileRefreshPeriod = conf.getInt(<a name="line.2136"></a>
<span class="sourceLineNo">2137</span>        StorefileRefresherChore.REGIONSERVER_STOREFILE_REFRESH_PERIOD,<a name="line.2137"></a>
<span class="sourceLineNo">2138</span>        StorefileRefresherChore.DEFAULT_REGIONSERVER_STOREFILE_REFRESH_PERIOD);<a name="line.2138"></a>
<span class="sourceLineNo">2139</span>    if (storefileRefreshPeriod == 0) {<a name="line.2139"></a>
<span class="sourceLineNo">2140</span>      storefileRefreshPeriod = conf.getInt(<a name="line.2140"></a>
<span class="sourceLineNo">2141</span>          StorefileRefresherChore.REGIONSERVER_META_STOREFILE_REFRESH_PERIOD,<a name="line.2141"></a>
<span class="sourceLineNo">2142</span>          StorefileRefresherChore.DEFAULT_REGIONSERVER_STOREFILE_REFRESH_PERIOD);<a name="line.2142"></a>
<span class="sourceLineNo">2143</span>      onlyMetaRefresh = true;<a name="line.2143"></a>
<span class="sourceLineNo">2144</span>    }<a name="line.2144"></a>
<span class="sourceLineNo">2145</span>    if (storefileRefreshPeriod &gt; 0) {<a name="line.2145"></a>
<span class="sourceLineNo">2146</span>      this.storefileRefresher = new StorefileRefresherChore(storefileRefreshPeriod,<a name="line.2146"></a>
<span class="sourceLineNo">2147</span>          onlyMetaRefresh, this, this);<a name="line.2147"></a>
<span class="sourceLineNo">2148</span>    }<a name="line.2148"></a>
<span class="sourceLineNo">2149</span>    registerConfigurationObservers();<a name="line.2149"></a>
<span class="sourceLineNo">2150</span>  }<a name="line.2150"></a>
<span class="sourceLineNo">2151</span><a name="line.2151"></a>
<span class="sourceLineNo">2152</span>  private void registerConfigurationObservers() {<a name="line.2152"></a>
<span class="sourceLineNo">2153</span>    // Registering the compactSplitThread object with the ConfigurationManager.<a name="line.2153"></a>
<span class="sourceLineNo">2154</span>    configurationManager.registerObserver(this.compactSplitThread);<a name="line.2154"></a>
<span class="sourceLineNo">2155</span>    configurationManager.registerObserver(this.rpcServices);<a name="line.2155"></a>
<span class="sourceLineNo">2156</span>    configurationManager.registerObserver(this);<a name="line.2156"></a>
<span class="sourceLineNo">2157</span>  }<a name="line.2157"></a>
<span class="sourceLineNo">2158</span><a name="line.2158"></a>
<span class="sourceLineNo">2159</span>  /**<a name="line.2159"></a>
<span class="sourceLineNo">2160</span>   * Puts up the webui.<a name="line.2160"></a>
<span class="sourceLineNo">2161</span>   */<a name="line.2161"></a>
<span class="sourceLineNo">2162</span>  private void putUpWebUI() throws IOException {<a name="line.2162"></a>
<span class="sourceLineNo">2163</span>    int port = this.conf.getInt(HConstants.REGIONSERVER_INFO_PORT,<a name="line.2163"></a>
<span class="sourceLineNo">2164</span>      HConstants.DEFAULT_REGIONSERVER_INFOPORT);<a name="line.2164"></a>
<span class="sourceLineNo">2165</span>    String addr = this.conf.get("hbase.regionserver.info.bindAddress", "0.0.0.0");<a name="line.2165"></a>
<span class="sourceLineNo">2166</span><a name="line.2166"></a>
<span class="sourceLineNo">2167</span>    if(this instanceof HMaster) {<a name="line.2167"></a>
<span class="sourceLineNo">2168</span>      port = conf.getInt(HConstants.MASTER_INFO_PORT,<a name="line.2168"></a>
<span class="sourceLineNo">2169</span>          HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.2169"></a>
<span class="sourceLineNo">2170</span>      addr = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.2170"></a>
<span class="sourceLineNo">2171</span>    }<a name="line.2171"></a>
<span class="sourceLineNo">2172</span>    // -1 is for disabling info server<a name="line.2172"></a>
<span class="sourceLineNo">2173</span>    if (port &lt; 0) {<a name="line.2173"></a>
<span class="sourceLineNo">2174</span>      return;<a name="line.2174"></a>
<span class="sourceLineNo">2175</span>    }<a name="line.2175"></a>
<span class="sourceLineNo">2176</span><a name="line.2176"></a>
<span class="sourceLineNo">2177</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.2177"></a>
<span class="sourceLineNo">2178</span>      String msg =<a name="line.2178"></a>
<span class="sourceLineNo">2179</span>          "Failed to start http info server. Address " + addr<a name="line.2179"></a>
<span class="sourceLineNo">2180</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.2180"></a>
<span class="sourceLineNo">2181</span>              + "hbase.regionserver.info.bindAddress";<a name="line.2181"></a>
<span class="sourceLineNo">2182</span>      LOG.error(msg);<a name="line.2182"></a>
<span class="sourceLineNo">2183</span>      throw new IOException(msg);<a name="line.2183"></a>
<span class="sourceLineNo">2184</span>    }<a name="line.2184"></a>
<span class="sourceLineNo">2185</span>    // check if auto port bind enabled<a name="line.2185"></a>
<span class="sourceLineNo">2186</span>    boolean auto = this.conf.getBoolean(HConstants.REGIONSERVER_INFO_PORT_AUTO, false);<a name="line.2186"></a>
<span class="sourceLineNo">2187</span>    while (true) {<a name="line.2187"></a>
<span class="sourceLineNo">2188</span>      try {<a name="line.2188"></a>
<span class="sourceLineNo">2189</span>        this.infoServer = new InfoServer(getProcessName(), addr, port, false, this.conf);<a name="line.2189"></a>
<span class="sourceLineNo">2190</span>        infoServer.addPrivilegedServlet("dump", "/dump", getDumpServlet());<a name="line.2190"></a>
<span class="sourceLineNo">2191</span>        configureInfoServer();<a name="line.2191"></a>
<span class="sourceLineNo">2192</span>        this.infoServer.start();<a name="line.2192"></a>
<span class="sourceLineNo">2193</span>        break;<a name="line.2193"></a>
<span class="sourceLineNo">2194</span>      } catch (BindException e) {<a name="line.2194"></a>
<span class="sourceLineNo">2195</span>        if (!auto) {<a name="line.2195"></a>
<span class="sourceLineNo">2196</span>          // auto bind disabled throw BindException<a name="line.2196"></a>
<span class="sourceLineNo">2197</span>          LOG.error("Failed binding http info server to port: " + port);<a name="line.2197"></a>
<span class="sourceLineNo">2198</span>          throw e;<a name="line.2198"></a>
<span class="sourceLineNo">2199</span>        }<a name="line.2199"></a>
<span class="sourceLineNo">2200</span>        // auto bind enabled, try to use another port<a name="line.2200"></a>
<span class="sourceLineNo">2201</span>        LOG.info("Failed binding http info server to port: " + port);<a name="line.2201"></a>
<span class="sourceLineNo">2202</span>        port++;<a name="line.2202"></a>
<span class="sourceLineNo">2203</span>      }<a name="line.2203"></a>
<span class="sourceLineNo">2204</span>    }<a name="line.2204"></a>
<span class="sourceLineNo">2205</span>    port = this.infoServer.getPort();<a name="line.2205"></a>
<span class="sourceLineNo">2206</span>    conf.setInt(HConstants.REGIONSERVER_INFO_PORT, port);<a name="line.2206"></a>
<span class="sourceLineNo">2207</span>    int masterInfoPort = conf.getInt(HConstants.MASTER_INFO_PORT,<a name="line.2207"></a>
<span class="sourceLineNo">2208</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.2208"></a>
<span class="sourceLineNo">2209</span>    conf.setInt("hbase.master.info.port.orig", masterInfoPort);<a name="line.2209"></a>
<span class="sourceLineNo">2210</span>    conf.setInt(HConstants.MASTER_INFO_PORT, port);<a name="line.2210"></a>
<span class="sourceLineNo">2211</span>  }<a name="line.2211"></a>
<span class="sourceLineNo">2212</span><a name="line.2212"></a>
<span class="sourceLineNo">2213</span>  /*<a name="line.2213"></a>
<span class="sourceLineNo">2214</span>   * Verify that server is healthy<a name="line.2214"></a>
<span class="sourceLineNo">2215</span>   */<a name="line.2215"></a>
<span class="sourceLineNo">2216</span>  private boolean isHealthy() {<a name="line.2216"></a>
<span class="sourceLineNo">2217</span>    if (!dataFsOk) {<a name="line.2217"></a>
<span class="sourceLineNo">2218</span>      // File system problem<a name="line.2218"></a>
<span class="sourceLineNo">2219</span>      return false;<a name="line.2219"></a>
<span class="sourceLineNo">2220</span>    }<a name="line.2220"></a>
<span class="sourceLineNo">2221</span>    // Verify that all threads are alive<a name="line.2221"></a>
<span class="sourceLineNo">2222</span>    boolean healthy = (this.leaseManager == null || this.leaseManager.isAlive())<a name="line.2222"></a>
<span class="sourceLineNo">2223</span>        &amp;&amp; (this.cacheFlusher == null || this.cacheFlusher.isAlive())<a name="line.2223"></a>
<span class="sourceLineNo">2224</span>        &amp;&amp; (this.walRoller == null || this.walRoller.isAlive())<a name="line.2224"></a>
<span class="sourceLineNo">2225</span>        &amp;&amp; (this.compactionChecker == null || this.compactionChecker.isScheduled())<a name="line.2225"></a>
<span class="sourceLineNo">2226</span>        &amp;&amp; (this.periodicFlusher == null || this.periodicFlusher.isScheduled());<a name="line.2226"></a>
<span class="sourceLineNo">2227</span>    if (!healthy) {<a name="line.2227"></a>
<span class="sourceLineNo">2228</span>      stop("One or more threads are no longer alive -- stop");<a name="line.2228"></a>
<span class="sourceLineNo">2229</span>    }<a name="line.2229"></a>
<span class="sourceLineNo">2230</span>    return healthy;<a name="line.2230"></a>
<span class="sourceLineNo">2231</span>  }<a name="line.2231"></a>
<span class="sourceLineNo">2232</span><a name="line.2232"></a>
<span class="sourceLineNo">2233</span>  @Override<a name="line.2233"></a>
<span class="sourceLineNo">2234</span>  public List&lt;WAL&gt; getWALs() {<a name="line.2234"></a>
<span class="sourceLineNo">2235</span>    return walFactory.getWALs();<a name="line.2235"></a>
<span class="sourceLineNo">2236</span>  }<a name="line.2236"></a>
<span class="sourceLineNo">2237</span><a name="line.2237"></a>
<span class="sourceLineNo">2238</span>  @Override<a name="line.2238"></a>
<span class="sourceLineNo">2239</span>  public WAL getWAL(RegionInfo regionInfo) throws IOException {<a name="line.2239"></a>
<span class="sourceLineNo">2240</span>    WAL wal = walFactory.getWAL(regionInfo);<a name="line.2240"></a>
<span class="sourceLineNo">2241</span>    if (this.walRoller != null) {<a name="line.2241"></a>
<span class="sourceLineNo">2242</span>      this.walRoller.addWAL(wal);<a name="line.2242"></a>
<span class="sourceLineNo">2243</span>    }<a name="line.2243"></a>
<span class="sourceLineNo">2244</span>    return wal;<a name="line.2244"></a>
<span class="sourceLineNo">2245</span>  }<a name="line.2245"></a>
<span class="sourceLineNo">2246</span><a name="line.2246"></a>
<span class="sourceLineNo">2247</span>  public LogRoller getWalRoller() {<a name="line.2247"></a>
<span class="sourceLineNo">2248</span>    return walRoller;<a name="line.2248"></a>
<span class="sourceLineNo">2249</span>  }<a name="line.2249"></a>
<span class="sourceLineNo">2250</span><a name="line.2250"></a>
<span class="sourceLineNo">2251</span>  WALFactory getWalFactory() {<a name="line.2251"></a>
<span class="sourceLineNo">2252</span>    return walFactory;<a name="line.2252"></a>
<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
<span class="sourceLineNo">2254</span><a name="line.2254"></a>
<span class="sourceLineNo">2255</span>  @Override<a name="line.2255"></a>
<span class="sourceLineNo">2256</span>  public Connection getConnection() {<a name="line.2256"></a>
<span class="sourceLineNo">2257</span>    return getAsyncConnection().toConnection();<a name="line.2257"></a>
<span class="sourceLineNo">2258</span>  }<a name="line.2258"></a>
<span class="sourceLineNo">2259</span><a name="line.2259"></a>
<span class="sourceLineNo">2260</span>  @Override<a name="line.2260"></a>
<span class="sourceLineNo">2261</span>  public void stop(final String msg) {<a name="line.2261"></a>
<span class="sourceLineNo">2262</span>    stop(msg, false, RpcServer.getRequestUser().orElse(null));<a name="line.2262"></a>
<span class="sourceLineNo">2263</span>  }<a name="line.2263"></a>
<span class="sourceLineNo">2264</span><a name="line.2264"></a>
<span class="sourceLineNo">2265</span>  /**<a name="line.2265"></a>
<span class="sourceLineNo">2266</span>   * Stops the regionserver.<a name="line.2266"></a>
<span class="sourceLineNo">2267</span>   * @param msg Status message<a name="line.2267"></a>
<span class="sourceLineNo">2268</span>   * @param force True if this is a regionserver abort<a name="line.2268"></a>
<span class="sourceLineNo">2269</span>   * @param user The user executing the stop request, or null if no user is associated<a name="line.2269"></a>
<span class="sourceLineNo">2270</span>   */<a name="line.2270"></a>
<span class="sourceLineNo">2271</span>  public void stop(final String msg, final boolean force, final User user) {<a name="line.2271"></a>
<span class="sourceLineNo">2272</span>    if (!this.stopped) {<a name="line.2272"></a>
<span class="sourceLineNo">2273</span>      LOG.info("***** STOPPING region server '" + this + "' *****");<a name="line.2273"></a>
<span class="sourceLineNo">2274</span>      if (this.rsHost != null) {<a name="line.2274"></a>
<span class="sourceLineNo">2275</span>        // when forced via abort don't allow CPs to override<a name="line.2275"></a>
<span class="sourceLineNo">2276</span>        try {<a name="line.2276"></a>
<span class="sourceLineNo">2277</span>          this.rsHost.preStop(msg, user);<a name="line.2277"></a>
<span class="sourceLineNo">2278</span>        } catch (IOException ioe) {<a name="line.2278"></a>
<span class="sourceLineNo">2279</span>          if (!force) {<a name="line.2279"></a>
<span class="sourceLineNo">2280</span>            LOG.warn("The region server did not stop", ioe);<a name="line.2280"></a>
<span class="sourceLineNo">2281</span>            return;<a name="line.2281"></a>
<span class="sourceLineNo">2282</span>          }<a name="line.2282"></a>
<span class="sourceLineNo">2283</span>          LOG.warn("Skipping coprocessor exception on preStop() due to forced shutdown", ioe);<a name="line.2283"></a>
<span class="sourceLineNo">2284</span>        }<a name="line.2284"></a>
<span class="sourceLineNo">2285</span>      }<a name="line.2285"></a>
<span class="sourceLineNo">2286</span>      this.stopped = true;<a name="line.2286"></a>
<span class="sourceLineNo">2287</span>      LOG.info("STOPPED: " + msg);<a name="line.2287"></a>
<span class="sourceLineNo">2288</span>      // Wakes run() if it is sleeping<a name="line.2288"></a>
<span class="sourceLineNo">2289</span>      sleeper.skipSleepCycle();<a name="line.2289"></a>
<span class="sourceLineNo">2290</span>    }<a name="line.2290"></a>
<span class="sourceLineNo">2291</span>  }<a name="line.2291"></a>
<span class="sourceLineNo">2292</span><a name="line.2292"></a>
<span class="sourceLineNo">2293</span>  public void waitForServerOnline(){<a name="line.2293"></a>
<span class="sourceLineNo">2294</span>    while (!isStopped() &amp;&amp; !isOnline()) {<a name="line.2294"></a>
<span class="sourceLineNo">2295</span>      synchronized (online) {<a name="line.2295"></a>
<span class="sourceLineNo">2296</span>        try {<a name="line.2296"></a>
<span class="sourceLineNo">2297</span>          online.wait(msgInterval);<a name="line.2297"></a>
<span class="sourceLineNo">2298</span>        } catch (InterruptedException ie) {<a name="line.2298"></a>
<span class="sourceLineNo">2299</span>          Thread.currentThread().interrupt();<a name="line.2299"></a>
<span class="sourceLineNo">2300</span>          break;<a name="line.2300"></a>
<span class="sourceLineNo">2301</span>        }<a name="line.2301"></a>
<span class="sourceLineNo">2302</span>      }<a name="line.2302"></a>
<span class="sourceLineNo">2303</span>    }<a name="line.2303"></a>
<span class="sourceLineNo">2304</span>  }<a name="line.2304"></a>
<span class="sourceLineNo">2305</span><a name="line.2305"></a>
<span class="sourceLineNo">2306</span>  @Override<a name="line.2306"></a>
<span class="sourceLineNo">2307</span>  public void postOpenDeployTasks(final PostOpenDeployContext context) throws IOException {<a name="line.2307"></a>
<span class="sourceLineNo">2308</span>    HRegion r = context.getRegion();<a name="line.2308"></a>
<span class="sourceLineNo">2309</span>    long openProcId = context.getOpenProcId();<a name="line.2309"></a>
<span class="sourceLineNo">2310</span>    long masterSystemTime = context.getMasterSystemTime();<a name="line.2310"></a>
<span class="sourceLineNo">2311</span>    rpcServices.checkOpen();<a name="line.2311"></a>
<span class="sourceLineNo">2312</span>    LOG.info("Post open deploy tasks for {}, pid={}, masterSystemTime={}",<a name="line.2312"></a>
<span class="sourceLineNo">2313</span>      r.getRegionInfo().getRegionNameAsString(), openProcId, masterSystemTime);<a name="line.2313"></a>
<span class="sourceLineNo">2314</span>    // Do checks to see if we need to compact (references or too many files)<a name="line.2314"></a>
<span class="sourceLineNo">2315</span>    // Skip compaction check if region is read only<a name="line.2315"></a>
<span class="sourceLineNo">2316</span>    if (!r.isReadOnly()) {<a name="line.2316"></a>
<span class="sourceLineNo">2317</span>      for (HStore s : r.stores.values()) {<a name="line.2317"></a>
<span class="sourceLineNo">2318</span>        if (s.hasReferences() || s.needsCompaction()) {<a name="line.2318"></a>
<span class="sourceLineNo">2319</span>          this.compactSplitThread.requestSystemCompaction(r, s, "Opening Region");<a name="line.2319"></a>
<span class="sourceLineNo">2320</span>        }<a name="line.2320"></a>
<span class="sourceLineNo">2321</span>      }<a name="line.2321"></a>
<span class="sourceLineNo">2322</span>    }<a name="line.2322"></a>
<span class="sourceLineNo">2323</span>    long openSeqNum = r.getOpenSeqNum();<a name="line.2323"></a>
<span class="sourceLineNo">2324</span>    if (openSeqNum == HConstants.NO_SEQNUM) {<a name="line.2324"></a>
<span class="sourceLineNo">2325</span>      // If we opened a region, we should have read some sequence number from it.<a name="line.2325"></a>
<span class="sourceLineNo">2326</span>      LOG.error(<a name="line.2326"></a>
<span class="sourceLineNo">2327</span>        "No sequence number found when opening " + r.getRegionInfo().getRegionNameAsString());<a name="line.2327"></a>
<span class="sourceLineNo">2328</span>      openSeqNum = 0;<a name="line.2328"></a>
<span class="sourceLineNo">2329</span>    }<a name="line.2329"></a>
<span class="sourceLineNo">2330</span><a name="line.2330"></a>
<span class="sourceLineNo">2331</span>    // Notify master<a name="line.2331"></a>
<span class="sourceLineNo">2332</span>    if (!reportRegionStateTransition(new RegionStateTransitionContext(TransitionCode.OPENED,<a name="line.2332"></a>
<span class="sourceLineNo">2333</span>      openSeqNum, openProcId, masterSystemTime, r.getRegionInfo()))) {<a name="line.2333"></a>
<span class="sourceLineNo">2334</span>      throw new IOException(<a name="line.2334"></a>
<span class="sourceLineNo">2335</span>        "Failed to report opened region to master: " + r.getRegionInfo().getRegionNameAsString());<a name="line.2335"></a>
<span class="sourceLineNo">2336</span>    }<a name="line.2336"></a>
<span class="sourceLineNo">2337</span><a name="line.2337"></a>
<span class="sourceLineNo">2338</span>    triggerFlushInPrimaryRegion(r);<a name="line.2338"></a>
<span class="sourceLineNo">2339</span><a name="line.2339"></a>
<span class="sourceLineNo">2340</span>    LOG.debug("Finished post open deploy task for " + r.getRegionInfo().getRegionNameAsString());<a name="line.2340"></a>
<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
<span class="sourceLineNo">2342</span><a name="line.2342"></a>
<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
<span class="sourceLineNo">2344</span>   * Helper method for use in tests. Skip the region transition report when there's no master<a name="line.2344"></a>
<span class="sourceLineNo">2345</span>   * around to receive it.<a name="line.2345"></a>
<span class="sourceLineNo">2346</span>   */<a name="line.2346"></a>
<span class="sourceLineNo">2347</span>  private boolean skipReportingTransition(final RegionStateTransitionContext context) {<a name="line.2347"></a>
<span class="sourceLineNo">2348</span>    final TransitionCode code = context.getCode();<a name="line.2348"></a>
<span class="sourceLineNo">2349</span>    final long openSeqNum = context.getOpenSeqNum();<a name="line.2349"></a>
<span class="sourceLineNo">2350</span>    long masterSystemTime = context.getMasterSystemTime();<a name="line.2350"></a>
<span class="sourceLineNo">2351</span>    final RegionInfo[] hris = context.getHris();<a name="line.2351"></a>
<span class="sourceLineNo">2352</span><a name="line.2352"></a>
<span class="sourceLineNo">2353</span>    if (code == TransitionCode.OPENED) {<a name="line.2353"></a>
<span class="sourceLineNo">2354</span>      Preconditions.checkArgument(hris != null &amp;&amp; hris.length == 1);<a name="line.2354"></a>
<span class="sourceLineNo">2355</span>      if (hris[0].isMetaRegion()) {<a name="line.2355"></a>
<span class="sourceLineNo">2356</span>        try {<a name="line.2356"></a>
<span class="sourceLineNo">2357</span>          MetaTableLocator.setMetaLocation(getZooKeeper(), serverName,<a name="line.2357"></a>
<span class="sourceLineNo">2358</span>              hris[0].getReplicaId(), RegionState.State.OPEN);<a name="line.2358"></a>
<span class="sourceLineNo">2359</span>        } catch (KeeperException e) {<a name="line.2359"></a>
<span class="sourceLineNo">2360</span>          LOG.info("Failed to update meta location", e);<a name="line.2360"></a>
<span class="sourceLineNo">2361</span>          return false;<a name="line.2361"></a>
<span class="sourceLineNo">2362</span>        }<a name="line.2362"></a>
<span class="sourceLineNo">2363</span>      } else {<a name="line.2363"></a>
<span class="sourceLineNo">2364</span>        try {<a name="line.2364"></a>
<span class="sourceLineNo">2365</span>          MetaTableAccessor.updateRegionLocation(asyncClusterConnection.toConnection(), hris[0],<a name="line.2365"></a>
<span class="sourceLineNo">2366</span>              serverName, openSeqNum, masterSystemTime);<a name="line.2366"></a>
<span class="sourceLineNo">2367</span>        } catch (IOException e) {<a name="line.2367"></a>
<span class="sourceLineNo">2368</span>          LOG.info("Failed to update meta", e);<a name="line.2368"></a>
<span class="sourceLineNo">2369</span>          return false;<a name="line.2369"></a>
<span class="sourceLineNo">2370</span>        }<a name="line.2370"></a>
<span class="sourceLineNo">2371</span>      }<a name="line.2371"></a>
<span class="sourceLineNo">2372</span>    }<a name="line.2372"></a>
<span class="sourceLineNo">2373</span>    return true;<a name="line.2373"></a>
<span class="sourceLineNo">2374</span>  }<a name="line.2374"></a>
<span class="sourceLineNo">2375</span><a name="line.2375"></a>
<span class="sourceLineNo">2376</span>  private ReportRegionStateTransitionRequest createReportRegionStateTransitionRequest(<a name="line.2376"></a>
<span class="sourceLineNo">2377</span>      final RegionStateTransitionContext context) {<a name="line.2377"></a>
<span class="sourceLineNo">2378</span>    final TransitionCode code = context.getCode();<a name="line.2378"></a>
<span class="sourceLineNo">2379</span>    final long openSeqNum = context.getOpenSeqNum();<a name="line.2379"></a>
<span class="sourceLineNo">2380</span>    final RegionInfo[] hris = context.getHris();<a name="line.2380"></a>
<span class="sourceLineNo">2381</span>    final long[] procIds = context.getProcIds();<a name="line.2381"></a>
<span class="sourceLineNo">2382</span><a name="line.2382"></a>
<span class="sourceLineNo">2383</span>    ReportRegionStateTransitionRequest.Builder builder =<a name="line.2383"></a>
<span class="sourceLineNo">2384</span>        ReportRegionStateTransitionRequest.newBuilder();<a name="line.2384"></a>
<span class="sourceLineNo">2385</span>    builder.setServer(ProtobufUtil.toServerName(serverName));<a name="line.2385"></a>
<span class="sourceLineNo">2386</span>    RegionStateTransition.Builder transition = builder.addTransitionBuilder();<a name="line.2386"></a>
<span class="sourceLineNo">2387</span>    transition.setTransitionCode(code);<a name="line.2387"></a>
<span class="sourceLineNo">2388</span>    if (code == TransitionCode.OPENED &amp;&amp; openSeqNum &gt;= 0) {<a name="line.2388"></a>
<span class="sourceLineNo">2389</span>      transition.setOpenSeqNum(openSeqNum);<a name="line.2389"></a>
<span class="sourceLineNo">2390</span>    }<a name="line.2390"></a>
<span class="sourceLineNo">2391</span>    for (RegionInfo hri: hris) {<a name="line.2391"></a>
<span class="sourceLineNo">2392</span>      transition.addRegionInfo(ProtobufUtil.toRegionInfo(hri));<a name="line.2392"></a>
<span class="sourceLineNo">2393</span>    }<a name="line.2393"></a>
<span class="sourceLineNo">2394</span>    for (long procId: procIds) {<a name="line.2394"></a>
<span class="sourceLineNo">2395</span>      transition.addProcId(procId);<a name="line.2395"></a>
<span class="sourceLineNo">2396</span>    }<a name="line.2396"></a>
<span class="sourceLineNo">2397</span><a name="line.2397"></a>
<span class="sourceLineNo">2398</span>    return builder.build();<a name="line.2398"></a>
<span class="sourceLineNo">2399</span>  }<a name="line.2399"></a>
<span class="sourceLineNo">2400</span><a name="line.2400"></a>
<span class="sourceLineNo">2401</span>  @Override<a name="line.2401"></a>
<span class="sourceLineNo">2402</span>  public boolean reportRegionStateTransition(final RegionStateTransitionContext context) {<a name="line.2402"></a>
<span class="sourceLineNo">2403</span>    if (TEST_SKIP_REPORTING_TRANSITION) {<a name="line.2403"></a>
<span class="sourceLineNo">2404</span>      return skipReportingTransition(context);<a name="line.2404"></a>
<span class="sourceLineNo">2405</span>    }<a name="line.2405"></a>
<span class="sourceLineNo">2406</span>    final ReportRegionStateTransitionRequest request =<a name="line.2406"></a>
<span class="sourceLineNo">2407</span>        createReportRegionStateTransitionRequest(context);<a name="line.2407"></a>
<span class="sourceLineNo">2408</span><a name="line.2408"></a>
<span class="sourceLineNo">2409</span>    // Time to pause if master says 'please hold'. Make configurable if needed.<a name="line.2409"></a>
<span class="sourceLineNo">2410</span>    final long initPauseTime = 1000;<a name="line.2410"></a>
<span class="sourceLineNo">2411</span>    int tries = 0;<a name="line.2411"></a>
<span class="sourceLineNo">2412</span>    long pauseTime;<a name="line.2412"></a>
<span class="sourceLineNo">2413</span>    // Keep looping till we get an error. We want to send reports even though server is going down.<a name="line.2413"></a>
<span class="sourceLineNo">2414</span>    // Only go down if clusterConnection is null. It is set to null almost as last thing as the<a name="line.2414"></a>
<span class="sourceLineNo">2415</span>    // HRegionServer does down.<a name="line.2415"></a>
<span class="sourceLineNo">2416</span>    while (this.asyncClusterConnection != null &amp;&amp; !this.asyncClusterConnection.isClosed()) {<a name="line.2416"></a>
<span class="sourceLineNo">2417</span>      RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.2417"></a>
<span class="sourceLineNo">2418</span>      try {<a name="line.2418"></a>
<span class="sourceLineNo">2419</span>        if (rss == null) {<a name="line.2419"></a>
<span class="sourceLineNo">2420</span>          createRegionServerStatusStub();<a name="line.2420"></a>
<span class="sourceLineNo">2421</span>          continue;<a name="line.2421"></a>
<span class="sourceLineNo">2422</span>        }<a name="line.2422"></a>
<span class="sourceLineNo">2423</span>        ReportRegionStateTransitionResponse response =<a name="line.2423"></a>
<span class="sourceLineNo">2424</span>          rss.reportRegionStateTransition(null, request);<a name="line.2424"></a>
<span class="sourceLineNo">2425</span>        if (response.hasErrorMessage()) {<a name="line.2425"></a>
<span class="sourceLineNo">2426</span>          LOG.info("TRANSITION FAILED " + request + ": " + response.getErrorMessage());<a name="line.2426"></a>
<span class="sourceLineNo">2427</span>          break;<a name="line.2427"></a>
<span class="sourceLineNo">2428</span>        }<a name="line.2428"></a>
<span class="sourceLineNo">2429</span>        // Log if we had to retry else don't log unless TRACE. We want to<a name="line.2429"></a>
<span class="sourceLineNo">2430</span>        // know if were successful after an attempt showed in logs as failed.<a name="line.2430"></a>
<span class="sourceLineNo">2431</span>        if (tries &gt; 0 || LOG.isTraceEnabled()) {<a name="line.2431"></a>
<span class="sourceLineNo">2432</span>          LOG.info("TRANSITION REPORTED " + request);<a name="line.2432"></a>
<span class="sourceLineNo">2433</span>        }<a name="line.2433"></a>
<span class="sourceLineNo">2434</span>        // NOTE: Return mid-method!!!<a name="line.2434"></a>
<span class="sourceLineNo">2435</span>        return true;<a name="line.2435"></a>
<span class="sourceLineNo">2436</span>      } catch (ServiceException se) {<a name="line.2436"></a>
<span class="sourceLineNo">2437</span>        IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.2437"></a>
<span class="sourceLineNo">2438</span>        boolean pause =<a name="line.2438"></a>
<span class="sourceLineNo">2439</span>            ioe instanceof ServerNotRunningYetException || ioe instanceof PleaseHoldException<a name="line.2439"></a>
<span class="sourceLineNo">2440</span>                || ioe instanceof CallQueueTooBigException;<a name="line.2440"></a>
<span class="sourceLineNo">2441</span>        if (pause) {<a name="line.2441"></a>
<span class="sourceLineNo">2442</span>          // Do backoff else we flood the Master with requests.<a name="line.2442"></a>
<span class="sourceLineNo">2443</span>          pauseTime = ConnectionUtils.getPauseTime(initPauseTime, tries);<a name="line.2443"></a>
<span class="sourceLineNo">2444</span>        } else {<a name="line.2444"></a>
<span class="sourceLineNo">2445</span>          pauseTime = initPauseTime; // Reset.<a name="line.2445"></a>
<span class="sourceLineNo">2446</span>        }<a name="line.2446"></a>
<span class="sourceLineNo">2447</span>        LOG.info("Failed report transition " +<a name="line.2447"></a>
<span class="sourceLineNo">2448</span>          TextFormat.shortDebugString(request) + "; retry (#" + tries + ")" +<a name="line.2448"></a>
<span class="sourceLineNo">2449</span>            (pause?<a name="line.2449"></a>
<span class="sourceLineNo">2450</span>                " after " + pauseTime + "ms delay (Master is coming online...).":<a name="line.2450"></a>
<span class="sourceLineNo">2451</span>                " immediately."),<a name="line.2451"></a>
<span class="sourceLineNo">2452</span>            ioe);<a name="line.2452"></a>
<span class="sourceLineNo">2453</span>        if (pause) Threads.sleep(pauseTime);<a name="line.2453"></a>
<span class="sourceLineNo">2454</span>        tries++;<a name="line.2454"></a>
<span class="sourceLineNo">2455</span>        if (rssStub == rss) {<a name="line.2455"></a>
<span class="sourceLineNo">2456</span>          rssStub = null;<a name="line.2456"></a>
<span class="sourceLineNo">2457</span>        }<a name="line.2457"></a>
<span class="sourceLineNo">2458</span>      }<a name="line.2458"></a>
<span class="sourceLineNo">2459</span>    }<a name="line.2459"></a>
<span class="sourceLineNo">2460</span>    return false;<a name="line.2460"></a>
<span class="sourceLineNo">2461</span>  }<a name="line.2461"></a>
<span class="sourceLineNo">2462</span><a name="line.2462"></a>
<span class="sourceLineNo">2463</span>  /**<a name="line.2463"></a>
<span class="sourceLineNo">2464</span>   * Trigger a flush in the primary region replica if this region is a secondary replica. Does not<a name="line.2464"></a>
<span class="sourceLineNo">2465</span>   * block this thread. See RegionReplicaFlushHandler for details.<a name="line.2465"></a>
<span class="sourceLineNo">2466</span>   */<a name="line.2466"></a>
<span class="sourceLineNo">2467</span>  private void triggerFlushInPrimaryRegion(final HRegion region) {<a name="line.2467"></a>
<span class="sourceLineNo">2468</span>    if (ServerRegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.2468"></a>
<span class="sourceLineNo">2469</span>      return;<a name="line.2469"></a>
<span class="sourceLineNo">2470</span>    }<a name="line.2470"></a>
<span class="sourceLineNo">2471</span>    if (!ServerRegionReplicaUtil.isRegionReplicaReplicationEnabled(region.conf) ||<a name="line.2471"></a>
<span class="sourceLineNo">2472</span>        !ServerRegionReplicaUtil.isRegionReplicaWaitForPrimaryFlushEnabled(<a name="line.2472"></a>
<span class="sourceLineNo">2473</span>          region.conf)) {<a name="line.2473"></a>
<span class="sourceLineNo">2474</span>      region.setReadsEnabled(true);<a name="line.2474"></a>
<span class="sourceLineNo">2475</span>      return;<a name="line.2475"></a>
<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
<span class="sourceLineNo">2477</span><a name="line.2477"></a>
<span class="sourceLineNo">2478</span>    region.setReadsEnabled(false); // disable reads before marking the region as opened.<a name="line.2478"></a>
<span class="sourceLineNo">2479</span>    // RegionReplicaFlushHandler might reset this.<a name="line.2479"></a>
<span class="sourceLineNo">2480</span><a name="line.2480"></a>
<span class="sourceLineNo">2481</span>    // Submit it to be handled by one of the handlers so that we do not block OpenRegionHandler<a name="line.2481"></a>
<span class="sourceLineNo">2482</span>    if (this.executorService != null) {<a name="line.2482"></a>
<span class="sourceLineNo">2483</span>      this.executorService.submit(new RegionReplicaFlushHandler(this, region));<a name="line.2483"></a>
<span class="sourceLineNo">2484</span>    } else {<a name="line.2484"></a>
<span class="sourceLineNo">2485</span>      LOG.info("Executor is null; not running flush of primary region replica for {}",<a name="line.2485"></a>
<span class="sourceLineNo">2486</span>        region.getRegionInfo());<a name="line.2486"></a>
<span class="sourceLineNo">2487</span>     }<a name="line.2487"></a>
<span class="sourceLineNo">2488</span>  }<a name="line.2488"></a>
<span class="sourceLineNo">2489</span><a name="line.2489"></a>
<span class="sourceLineNo">2490</span>  @Override<a name="line.2490"></a>
<span class="sourceLineNo">2491</span>  public RpcServerInterface getRpcServer() {<a name="line.2491"></a>
<span class="sourceLineNo">2492</span>    return rpcServices.rpcServer;<a name="line.2492"></a>
<span class="sourceLineNo">2493</span>  }<a name="line.2493"></a>
<span class="sourceLineNo">2494</span><a name="line.2494"></a>
<span class="sourceLineNo">2495</span>  @VisibleForTesting<a name="line.2495"></a>
<span class="sourceLineNo">2496</span>  public RSRpcServices getRSRpcServices() {<a name="line.2496"></a>
<span class="sourceLineNo">2497</span>    return rpcServices;<a name="line.2497"></a>
<span class="sourceLineNo">2498</span>  }<a name="line.2498"></a>
<span class="sourceLineNo">2499</span><a name="line.2499"></a>
<span class="sourceLineNo">2500</span>  /**<a name="line.2500"></a>
<span class="sourceLineNo">2501</span>   * Cause the server to exit without closing the regions it is serving, the log<a name="line.2501"></a>
<span class="sourceLineNo">2502</span>   * it is using and without notifying the master. Used unit testing and on<a name="line.2502"></a>
<span class="sourceLineNo">2503</span>   * catastrophic events such as HDFS is yanked out from under hbase or we OOME.<a name="line.2503"></a>
<span class="sourceLineNo">2504</span>   *<a name="line.2504"></a>
<span class="sourceLineNo">2505</span>   * @param reason<a name="line.2505"></a>
<span class="sourceLineNo">2506</span>   *          the reason we are aborting<a name="line.2506"></a>
<span class="sourceLineNo">2507</span>   * @param cause<a name="line.2507"></a>
<span class="sourceLineNo">2508</span>   *          the exception that caused the abort, or null<a name="line.2508"></a>
<span class="sourceLineNo">2509</span>   */<a name="line.2509"></a>
<span class="sourceLineNo">2510</span>  @Override<a name="line.2510"></a>
<span class="sourceLineNo">2511</span>  public void abort(String reason, Throwable cause) {<a name="line.2511"></a>
<span class="sourceLineNo">2512</span>    if (!setAbortRequested()) {<a name="line.2512"></a>
<span class="sourceLineNo">2513</span>      // Abort already in progress, ignore the new request.<a name="line.2513"></a>
<span class="sourceLineNo">2514</span>      LOG.debug(<a name="line.2514"></a>
<span class="sourceLineNo">2515</span>          "Abort already in progress. Ignoring the current request with reason: {}", reason);<a name="line.2515"></a>
<span class="sourceLineNo">2516</span>      return;<a name="line.2516"></a>
<span class="sourceLineNo">2517</span>    }<a name="line.2517"></a>
<span class="sourceLineNo">2518</span>    String msg = "***** ABORTING region server " + this + ": " + reason + " *****";<a name="line.2518"></a>
<span class="sourceLineNo">2519</span>    if (cause != null) {<a name="line.2519"></a>
<span class="sourceLineNo">2520</span>      LOG.error(HBaseMarkers.FATAL, msg, cause);<a name="line.2520"></a>
<span class="sourceLineNo">2521</span>    } else {<a name="line.2521"></a>
<span class="sourceLineNo">2522</span>      LOG.error(HBaseMarkers.FATAL, msg);<a name="line.2522"></a>
<span class="sourceLineNo">2523</span>    }<a name="line.2523"></a>
<span class="sourceLineNo">2524</span>    // HBASE-4014: show list of coprocessors that were loaded to help debug<a name="line.2524"></a>
<span class="sourceLineNo">2525</span>    // regionserver crashes.Note that we're implicitly using<a name="line.2525"></a>
<span class="sourceLineNo">2526</span>    // java.util.HashSet's toString() method to print the coprocessor names.<a name="line.2526"></a>
<span class="sourceLineNo">2527</span>    LOG.error(HBaseMarkers.FATAL, "RegionServer abort: loaded coprocessors are: " +<a name="line.2527"></a>
<span class="sourceLineNo">2528</span>        CoprocessorHost.getLoadedCoprocessors());<a name="line.2528"></a>
<span class="sourceLineNo">2529</span>    // Try and dump metrics if abort -- might give clue as to how fatal came about....<a name="line.2529"></a>
<span class="sourceLineNo">2530</span>    try {<a name="line.2530"></a>
<span class="sourceLineNo">2531</span>      LOG.info("Dump of metrics as JSON on abort: " + DumpRegionServerMetrics.dumpMetrics());<a name="line.2531"></a>
<span class="sourceLineNo">2532</span>    } catch (MalformedObjectNameException | IOException e) {<a name="line.2532"></a>
<span class="sourceLineNo">2533</span>      LOG.warn("Failed dumping metrics", e);<a name="line.2533"></a>
<span class="sourceLineNo">2534</span>    }<a name="line.2534"></a>
<span class="sourceLineNo">2535</span><a name="line.2535"></a>
<span class="sourceLineNo">2536</span>    // Do our best to report our abort to the master, but this may not work<a name="line.2536"></a>
<span class="sourceLineNo">2537</span>    try {<a name="line.2537"></a>
<span class="sourceLineNo">2538</span>      if (cause != null) {<a name="line.2538"></a>
<span class="sourceLineNo">2539</span>        msg += "\nCause:\n" + Throwables.getStackTraceAsString(cause);<a name="line.2539"></a>
<span class="sourceLineNo">2540</span>      }<a name="line.2540"></a>
<span class="sourceLineNo">2541</span>      // Report to the master but only if we have already registered with the master.<a name="line.2541"></a>
<span class="sourceLineNo">2542</span>      RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.2542"></a>
<span class="sourceLineNo">2543</span>      if (rss != null &amp;&amp; this.serverName != null) {<a name="line.2543"></a>
<span class="sourceLineNo">2544</span>        ReportRSFatalErrorRequest.Builder builder =<a name="line.2544"></a>
<span class="sourceLineNo">2545</span>          ReportRSFatalErrorRequest.newBuilder();<a name="line.2545"></a>
<span class="sourceLineNo">2546</span>        builder.setServer(ProtobufUtil.toServerName(this.serverName));<a name="line.2546"></a>
<span class="sourceLineNo">2547</span>        builder.setErrorMessage(msg);<a name="line.2547"></a>
<span class="sourceLineNo">2548</span>        rss.reportRSFatalError(null, builder.build());<a name="line.2548"></a>
<span class="sourceLineNo">2549</span>      }<a name="line.2549"></a>
<span class="sourceLineNo">2550</span>    } catch (Throwable t) {<a name="line.2550"></a>
<span class="sourceLineNo">2551</span>      LOG.warn("Unable to report fatal error to master", t);<a name="line.2551"></a>
<span class="sourceLineNo">2552</span>    }<a name="line.2552"></a>
<span class="sourceLineNo">2553</span><a name="line.2553"></a>
<span class="sourceLineNo">2554</span>    scheduleAbortTimer();<a name="line.2554"></a>
<span class="sourceLineNo">2555</span>    // shutdown should be run as the internal user<a name="line.2555"></a>
<span class="sourceLineNo">2556</span>    stop(reason, true, null);<a name="line.2556"></a>
<span class="sourceLineNo">2557</span>  }<a name="line.2557"></a>
<span class="sourceLineNo">2558</span><a name="line.2558"></a>
<span class="sourceLineNo">2559</span>  /**<a name="line.2559"></a>
<span class="sourceLineNo">2560</span>   * Sets the abort state if not already set.<a name="line.2560"></a>
<span class="sourceLineNo">2561</span>   * @return True if abortRequested set to True successfully, false if an abort is already in<a name="line.2561"></a>
<span class="sourceLineNo">2562</span>   * progress.<a name="line.2562"></a>
<span class="sourceLineNo">2563</span>   */<a name="line.2563"></a>
<span class="sourceLineNo">2564</span>  protected boolean setAbortRequested() {<a name="line.2564"></a>
<span class="sourceLineNo">2565</span>    return abortRequested.compareAndSet(false, true);<a name="line.2565"></a>
<span class="sourceLineNo">2566</span>  }<a name="line.2566"></a>
<span class="sourceLineNo">2567</span><a name="line.2567"></a>
<span class="sourceLineNo">2568</span>  /**<a name="line.2568"></a>
<span class="sourceLineNo">2569</span>   * @see HRegionServer#abort(String, Throwable)<a name="line.2569"></a>
<span class="sourceLineNo">2570</span>   */<a name="line.2570"></a>
<span class="sourceLineNo">2571</span>  public void abort(String reason) {<a name="line.2571"></a>
<span class="sourceLineNo">2572</span>    abort(reason, null);<a name="line.2572"></a>
<span class="sourceLineNo">2573</span>  }<a name="line.2573"></a>
<span class="sourceLineNo">2574</span><a name="line.2574"></a>
<span class="sourceLineNo">2575</span>  @Override<a name="line.2575"></a>
<span class="sourceLineNo">2576</span>  public boolean isAborted() {<a name="line.2576"></a>
<span class="sourceLineNo">2577</span>    return abortRequested.get();<a name="line.2577"></a>
<span class="sourceLineNo">2578</span>  }<a name="line.2578"></a>
<span class="sourceLineNo">2579</span><a name="line.2579"></a>
<span class="sourceLineNo">2580</span>  /*<a name="line.2580"></a>
<span class="sourceLineNo">2581</span>   * Simulate a kill -9 of this server. Exits w/o closing regions or cleaninup<a name="line.2581"></a>
<span class="sourceLineNo">2582</span>   * logs but it does close socket in case want to bring up server on old<a name="line.2582"></a>
<span class="sourceLineNo">2583</span>   * hostname+port immediately.<a name="line.2583"></a>
<span class="sourceLineNo">2584</span>   */<a name="line.2584"></a>
<span class="sourceLineNo">2585</span>  @VisibleForTesting<a name="line.2585"></a>
<span class="sourceLineNo">2586</span>  protected void kill() {<a name="line.2586"></a>
<span class="sourceLineNo">2587</span>    this.killed = true;<a name="line.2587"></a>
<span class="sourceLineNo">2588</span>    abort("Simulated kill");<a name="line.2588"></a>
<span class="sourceLineNo">2589</span>  }<a name="line.2589"></a>
<span class="sourceLineNo">2590</span><a name="line.2590"></a>
<span class="sourceLineNo">2591</span>  // Limits the time spent in the shutdown process.<a name="line.2591"></a>
<span class="sourceLineNo">2592</span>  private void scheduleAbortTimer() {<a name="line.2592"></a>
<span class="sourceLineNo">2593</span>    if (this.abortMonitor == null) {<a name="line.2593"></a>
<span class="sourceLineNo">2594</span>      this.abortMonitor = new Timer("Abort regionserver monitor", true);<a name="line.2594"></a>
<span class="sourceLineNo">2595</span>      TimerTask abortTimeoutTask = null;<a name="line.2595"></a>
<span class="sourceLineNo">2596</span>      try {<a name="line.2596"></a>
<span class="sourceLineNo">2597</span>        Constructor&lt;? extends TimerTask&gt; timerTaskCtor =<a name="line.2597"></a>
<span class="sourceLineNo">2598</span>          Class.forName(conf.get(ABORT_TIMEOUT_TASK, SystemExitWhenAbortTimeout.class.getName()))<a name="line.2598"></a>
<span class="sourceLineNo">2599</span>            .asSubclass(TimerTask.class).getDeclaredConstructor();<a name="line.2599"></a>
<span class="sourceLineNo">2600</span>        timerTaskCtor.setAccessible(true);<a name="line.2600"></a>
<span class="sourceLineNo">2601</span>        abortTimeoutTask = timerTaskCtor.newInstance();<a name="line.2601"></a>
<span class="sourceLineNo">2602</span>      } catch (Exception e) {<a name="line.2602"></a>
<span class="sourceLineNo">2603</span>        LOG.warn("Initialize abort timeout task failed", e);<a name="line.2603"></a>
<span class="sourceLineNo">2604</span>      }<a name="line.2604"></a>
<span class="sourceLineNo">2605</span>      if (abortTimeoutTask != null) {<a name="line.2605"></a>
<span class="sourceLineNo">2606</span>        abortMonitor.schedule(abortTimeoutTask, conf.getLong(ABORT_TIMEOUT, DEFAULT_ABORT_TIMEOUT));<a name="line.2606"></a>
<span class="sourceLineNo">2607</span>      }<a name="line.2607"></a>
<span class="sourceLineNo">2608</span>    }<a name="line.2608"></a>
<span class="sourceLineNo">2609</span>  }<a name="line.2609"></a>
<span class="sourceLineNo">2610</span><a name="line.2610"></a>
<span class="sourceLineNo">2611</span>  /**<a name="line.2611"></a>
<span class="sourceLineNo">2612</span>   * Wait on all threads to finish. Presumption is that all closes and stops<a name="line.2612"></a>
<span class="sourceLineNo">2613</span>   * have already been called.<a name="line.2613"></a>
<span class="sourceLineNo">2614</span>   */<a name="line.2614"></a>
<span class="sourceLineNo">2615</span>  protected void stopServiceThreads() {<a name="line.2615"></a>
<span class="sourceLineNo">2616</span>    // clean up the scheduled chores<a name="line.2616"></a>
<span class="sourceLineNo">2617</span>    if (this.choreService != null) {<a name="line.2617"></a>
<span class="sourceLineNo">2618</span>      choreService.cancelChore(nonceManagerChore);<a name="line.2618"></a>
<span class="sourceLineNo">2619</span>      choreService.cancelChore(compactionChecker);<a name="line.2619"></a>
<span class="sourceLineNo">2620</span>      choreService.cancelChore(periodicFlusher);<a name="line.2620"></a>
<span class="sourceLineNo">2621</span>      choreService.cancelChore(healthCheckChore);<a name="line.2621"></a>
<span class="sourceLineNo">2622</span>      choreService.cancelChore(executorStatusChore);<a name="line.2622"></a>
<span class="sourceLineNo">2623</span>      choreService.cancelChore(storefileRefresher);<a name="line.2623"></a>
<span class="sourceLineNo">2624</span>      choreService.cancelChore(fsUtilizationChore);<a name="line.2624"></a>
<span class="sourceLineNo">2625</span>      choreService.cancelChore(slowLogTableOpsChore);<a name="line.2625"></a>
<span class="sourceLineNo">2626</span>      // clean up the remaining scheduled chores (in case we missed out any)<a name="line.2626"></a>
<span class="sourceLineNo">2627</span>      choreService.shutdown();<a name="line.2627"></a>
<span class="sourceLineNo">2628</span>    }<a name="line.2628"></a>
<span class="sourceLineNo">2629</span><a name="line.2629"></a>
<span class="sourceLineNo">2630</span>    if (this.cacheFlusher != null) {<a name="line.2630"></a>
<span class="sourceLineNo">2631</span>      this.cacheFlusher.join();<a name="line.2631"></a>
<span class="sourceLineNo">2632</span>    }<a name="line.2632"></a>
<span class="sourceLineNo">2633</span><a name="line.2633"></a>
<span class="sourceLineNo">2634</span>    if (this.spanReceiverHost != null) {<a name="line.2634"></a>
<span class="sourceLineNo">2635</span>      this.spanReceiverHost.closeReceivers();<a name="line.2635"></a>
<span class="sourceLineNo">2636</span>    }<a name="line.2636"></a>
<span class="sourceLineNo">2637</span>    if (this.walRoller != null) {<a name="line.2637"></a>
<span class="sourceLineNo">2638</span>      this.walRoller.close();<a name="line.2638"></a>
<span class="sourceLineNo">2639</span>    }<a name="line.2639"></a>
<span class="sourceLineNo">2640</span>    if (this.compactSplitThread != null) {<a name="line.2640"></a>
<span class="sourceLineNo">2641</span>      this.compactSplitThread.join();<a name="line.2641"></a>
<span class="sourceLineNo">2642</span>    }<a name="line.2642"></a>
<span class="sourceLineNo">2643</span>    if (this.executorService != null) {<a name="line.2643"></a>
<span class="sourceLineNo">2644</span>      this.executorService.shutdown();<a name="line.2644"></a>
<span class="sourceLineNo">2645</span>    }<a name="line.2645"></a>
<span class="sourceLineNo">2646</span>    if (sameReplicationSourceAndSink &amp;&amp; this.replicationSourceHandler != null) {<a name="line.2646"></a>
<span class="sourceLineNo">2647</span>      this.replicationSourceHandler.stopReplicationService();<a name="line.2647"></a>
<span class="sourceLineNo">2648</span>    } else {<a name="line.2648"></a>
<span class="sourceLineNo">2649</span>      if (this.replicationSourceHandler != null) {<a name="line.2649"></a>
<span class="sourceLineNo">2650</span>        this.replicationSourceHandler.stopReplicationService();<a name="line.2650"></a>
<span class="sourceLineNo">2651</span>      }<a name="line.2651"></a>
<span class="sourceLineNo">2652</span>      if (this.replicationSinkHandler != null) {<a name="line.2652"></a>
<span class="sourceLineNo">2653</span>        this.replicationSinkHandler.stopReplicationService();<a name="line.2653"></a>
<span class="sourceLineNo">2654</span>      }<a name="line.2654"></a>
<span class="sourceLineNo">2655</span>    }<a name="line.2655"></a>
<span class="sourceLineNo">2656</span>  }<a name="line.2656"></a>
<span class="sourceLineNo">2657</span><a name="line.2657"></a>
<span class="sourceLineNo">2658</span>  /**<a name="line.2658"></a>
<span class="sourceLineNo">2659</span>   * @return Return the object that implements the replication<a name="line.2659"></a>
<span class="sourceLineNo">2660</span>   * source executorService.<a name="line.2660"></a>
<span class="sourceLineNo">2661</span>   */<a name="line.2661"></a>
<span class="sourceLineNo">2662</span>  @Override<a name="line.2662"></a>
<span class="sourceLineNo">2663</span>  public ReplicationSourceService getReplicationSourceService() {<a name="line.2663"></a>
<span class="sourceLineNo">2664</span>    return replicationSourceHandler;<a name="line.2664"></a>
<span class="sourceLineNo">2665</span>  }<a name="line.2665"></a>
<span class="sourceLineNo">2666</span><a name="line.2666"></a>
<span class="sourceLineNo">2667</span>  /**<a name="line.2667"></a>
<span class="sourceLineNo">2668</span>   * @return Return the object that implements the replication sink executorService.<a name="line.2668"></a>
<span class="sourceLineNo">2669</span>   */<a name="line.2669"></a>
<span class="sourceLineNo">2670</span>  public ReplicationSinkService getReplicationSinkService() {<a name="line.2670"></a>
<span class="sourceLineNo">2671</span>    return replicationSinkHandler;<a name="line.2671"></a>
<span class="sourceLineNo">2672</span>  }<a name="line.2672"></a>
<span class="sourceLineNo">2673</span><a name="line.2673"></a>
<span class="sourceLineNo">2674</span>  /**<a name="line.2674"></a>
<span class="sourceLineNo">2675</span>   * Get the current master from ZooKeeper and open the RPC connection to it.<a name="line.2675"></a>
<span class="sourceLineNo">2676</span>   * To get a fresh connection, the current rssStub must be null.<a name="line.2676"></a>
<span class="sourceLineNo">2677</span>   * Method will block until a master is available. You can break from this<a name="line.2677"></a>
<span class="sourceLineNo">2678</span>   * block by requesting the server stop.<a name="line.2678"></a>
<span class="sourceLineNo">2679</span>   *<a name="line.2679"></a>
<span class="sourceLineNo">2680</span>   * @return master + port, or null if server has been stopped<a name="line.2680"></a>
<span class="sourceLineNo">2681</span>   */<a name="line.2681"></a>
<span class="sourceLineNo">2682</span>  private synchronized ServerName createRegionServerStatusStub() {<a name="line.2682"></a>
<span class="sourceLineNo">2683</span>    // Create RS stub without refreshing the master node from ZK, use cached data<a name="line.2683"></a>
<span class="sourceLineNo">2684</span>    return createRegionServerStatusStub(false);<a name="line.2684"></a>
<span class="sourceLineNo">2685</span>  }<a name="line.2685"></a>
<span class="sourceLineNo">2686</span><a name="line.2686"></a>
<span class="sourceLineNo">2687</span>  /**<a name="line.2687"></a>
<span class="sourceLineNo">2688</span>   * Get the current master from ZooKeeper and open the RPC connection to it. To get a fresh<a name="line.2688"></a>
<span class="sourceLineNo">2689</span>   * connection, the current rssStub must be null. Method will block until a master is available.<a name="line.2689"></a>
<span class="sourceLineNo">2690</span>   * You can break from this block by requesting the server stop.<a name="line.2690"></a>
<span class="sourceLineNo">2691</span>   * @param refresh If true then master address will be read from ZK, otherwise use cached data<a name="line.2691"></a>
<span class="sourceLineNo">2692</span>   * @return master + port, or null if server has been stopped<a name="line.2692"></a>
<span class="sourceLineNo">2693</span>   */<a name="line.2693"></a>
<span class="sourceLineNo">2694</span>  @VisibleForTesting<a name="line.2694"></a>
<span class="sourceLineNo">2695</span>  protected synchronized ServerName createRegionServerStatusStub(boolean refresh) {<a name="line.2695"></a>
<span class="sourceLineNo">2696</span>    if (rssStub != null) {<a name="line.2696"></a>
<span class="sourceLineNo">2697</span>      return masterAddressTracker.getMasterAddress();<a name="line.2697"></a>
<span class="sourceLineNo">2698</span>    }<a name="line.2698"></a>
<span class="sourceLineNo">2699</span>    ServerName sn = null;<a name="line.2699"></a>
<span class="sourceLineNo">2700</span>    long previousLogTime = 0;<a name="line.2700"></a>
<span class="sourceLineNo">2701</span>    RegionServerStatusService.BlockingInterface intRssStub = null;<a name="line.2701"></a>
<span class="sourceLineNo">2702</span>    LockService.BlockingInterface intLockStub = null;<a name="line.2702"></a>
<span class="sourceLineNo">2703</span>    boolean interrupted = false;<a name="line.2703"></a>
<span class="sourceLineNo">2704</span>    try {<a name="line.2704"></a>
<span class="sourceLineNo">2705</span>      while (keepLooping()) {<a name="line.2705"></a>
<span class="sourceLineNo">2706</span>        sn = this.masterAddressTracker.getMasterAddress(refresh);<a name="line.2706"></a>
<span class="sourceLineNo">2707</span>        if (sn == null) {<a name="line.2707"></a>
<span class="sourceLineNo">2708</span>          if (!keepLooping()) {<a name="line.2708"></a>
<span class="sourceLineNo">2709</span>            // give up with no connection.<a name="line.2709"></a>
<span class="sourceLineNo">2710</span>            LOG.debug("No master found and cluster is stopped; bailing out");<a name="line.2710"></a>
<span class="sourceLineNo">2711</span>            return null;<a name="line.2711"></a>
<span class="sourceLineNo">2712</span>          }<a name="line.2712"></a>
<span class="sourceLineNo">2713</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.2713"></a>
<span class="sourceLineNo">2714</span>            LOG.debug("No master found; retry");<a name="line.2714"></a>
<span class="sourceLineNo">2715</span>            previousLogTime = System.currentTimeMillis();<a name="line.2715"></a>
<span class="sourceLineNo">2716</span>          }<a name="line.2716"></a>
<span class="sourceLineNo">2717</span>          refresh = true; // let's try pull it from ZK directly<a name="line.2717"></a>
<span class="sourceLineNo">2718</span>          if (sleepInterrupted(200)) {<a name="line.2718"></a>
<span class="sourceLineNo">2719</span>            interrupted = true;<a name="line.2719"></a>
<span class="sourceLineNo">2720</span>          }<a name="line.2720"></a>
<span class="sourceLineNo">2721</span>          continue;<a name="line.2721"></a>
<span class="sourceLineNo">2722</span>        }<a name="line.2722"></a>
<span class="sourceLineNo">2723</span><a name="line.2723"></a>
<span class="sourceLineNo">2724</span>        // If we are on the active master, use the shortcut<a name="line.2724"></a>
<span class="sourceLineNo">2725</span>        if (this instanceof HMaster &amp;&amp; sn.equals(getServerName())) {<a name="line.2725"></a>
<span class="sourceLineNo">2726</span>          // Wrap the shortcut in a class providing our version to the calls where it's relevant.<a name="line.2726"></a>
<span class="sourceLineNo">2727</span>          // Normally, RpcServer-based threadlocals do that.<a name="line.2727"></a>
<span class="sourceLineNo">2728</span>          intRssStub = new MasterRpcServicesVersionWrapper(((HMaster)this).getMasterRpcServices());<a name="line.2728"></a>
<span class="sourceLineNo">2729</span>          intLockStub = ((HMaster)this).getMasterRpcServices();<a name="line.2729"></a>
<span class="sourceLineNo">2730</span>          break;<a name="line.2730"></a>
<span class="sourceLineNo">2731</span>        }<a name="line.2731"></a>
<span class="sourceLineNo">2732</span>        try {<a name="line.2732"></a>
<span class="sourceLineNo">2733</span>          BlockingRpcChannel channel =<a name="line.2733"></a>
<span class="sourceLineNo">2734</span>            this.rpcClient.createBlockingRpcChannel(sn, userProvider.getCurrent(),<a name="line.2734"></a>
<span class="sourceLineNo">2735</span>              shortOperationTimeout);<a name="line.2735"></a>
<span class="sourceLineNo">2736</span>          intRssStub = RegionServerStatusService.newBlockingStub(channel);<a name="line.2736"></a>
<span class="sourceLineNo">2737</span>          intLockStub = LockService.newBlockingStub(channel);<a name="line.2737"></a>
<span class="sourceLineNo">2738</span>          break;<a name="line.2738"></a>
<span class="sourceLineNo">2739</span>        } catch (IOException e) {<a name="line.2739"></a>
<span class="sourceLineNo">2740</span>          if (System.currentTimeMillis() &gt; (previousLogTime + 1000)) {<a name="line.2740"></a>
<span class="sourceLineNo">2741</span>            e = e instanceof RemoteException ?<a name="line.2741"></a>
<span class="sourceLineNo">2742</span>              ((RemoteException)e).unwrapRemoteException() : e;<a name="line.2742"></a>
<span class="sourceLineNo">2743</span>            if (e instanceof ServerNotRunningYetException) {<a name="line.2743"></a>
<span class="sourceLineNo">2744</span>              LOG.info("Master isn't available yet, retrying");<a name="line.2744"></a>
<span class="sourceLineNo">2745</span>            } else {<a name="line.2745"></a>
<span class="sourceLineNo">2746</span>              LOG.warn("Unable to connect to master. Retrying. Error was:", e);<a name="line.2746"></a>
<span class="sourceLineNo">2747</span>            }<a name="line.2747"></a>
<span class="sourceLineNo">2748</span>            previousLogTime = System.currentTimeMillis();<a name="line.2748"></a>
<span class="sourceLineNo">2749</span>          }<a name="line.2749"></a>
<span class="sourceLineNo">2750</span>          if (sleepInterrupted(200)) {<a name="line.2750"></a>
<span class="sourceLineNo">2751</span>            interrupted = true;<a name="line.2751"></a>
<span class="sourceLineNo">2752</span>          }<a name="line.2752"></a>
<span class="sourceLineNo">2753</span>        }<a name="line.2753"></a>
<span class="sourceLineNo">2754</span>      }<a name="line.2754"></a>
<span class="sourceLineNo">2755</span>    } finally {<a name="line.2755"></a>
<span class="sourceLineNo">2756</span>      if (interrupted) {<a name="line.2756"></a>
<span class="sourceLineNo">2757</span>        Thread.currentThread().interrupt();<a name="line.2757"></a>
<span class="sourceLineNo">2758</span>      }<a name="line.2758"></a>
<span class="sourceLineNo">2759</span>    }<a name="line.2759"></a>
<span class="sourceLineNo">2760</span>    this.rssStub = intRssStub;<a name="line.2760"></a>
<span class="sourceLineNo">2761</span>    this.lockStub = intLockStub;<a name="line.2761"></a>
<span class="sourceLineNo">2762</span>    return sn;<a name="line.2762"></a>
<span class="sourceLineNo">2763</span>  }<a name="line.2763"></a>
<span class="sourceLineNo">2764</span><a name="line.2764"></a>
<span class="sourceLineNo">2765</span>  /**<a name="line.2765"></a>
<span class="sourceLineNo">2766</span>   * @return True if we should break loop because cluster is going down or<a name="line.2766"></a>
<span class="sourceLineNo">2767</span>   * this server has been stopped or hdfs has gone bad.<a name="line.2767"></a>
<span class="sourceLineNo">2768</span>   */<a name="line.2768"></a>
<span class="sourceLineNo">2769</span>  private boolean keepLooping() {<a name="line.2769"></a>
<span class="sourceLineNo">2770</span>    return !this.stopped &amp;&amp; isClusterUp();<a name="line.2770"></a>
<span class="sourceLineNo">2771</span>  }<a name="line.2771"></a>
<span class="sourceLineNo">2772</span><a name="line.2772"></a>
<span class="sourceLineNo">2773</span>  /*<a name="line.2773"></a>
<span class="sourceLineNo">2774</span>   * Let the master know we're here Run initialization using parameters passed<a name="line.2774"></a>
<span class="sourceLineNo">2775</span>   * us by the master.<a name="line.2775"></a>
<span class="sourceLineNo">2776</span>   * @return A Map of key/value configurations we got from the Master else<a name="line.2776"></a>
<span class="sourceLineNo">2777</span>   * null if we failed to register.<a name="line.2777"></a>
<span class="sourceLineNo">2778</span>   * @throws IOException<a name="line.2778"></a>
<span class="sourceLineNo">2779</span>   */<a name="line.2779"></a>
<span class="sourceLineNo">2780</span>  private RegionServerStartupResponse reportForDuty() throws IOException {<a name="line.2780"></a>
<span class="sourceLineNo">2781</span>    if (this.masterless) return RegionServerStartupResponse.getDefaultInstance();<a name="line.2781"></a>
<span class="sourceLineNo">2782</span>    ServerName masterServerName = createRegionServerStatusStub(true);<a name="line.2782"></a>
<span class="sourceLineNo">2783</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.2783"></a>
<span class="sourceLineNo">2784</span>    if (masterServerName == null || rss == null) return null;<a name="line.2784"></a>
<span class="sourceLineNo">2785</span>    RegionServerStartupResponse result = null;<a name="line.2785"></a>
<span class="sourceLineNo">2786</span>    try {<a name="line.2786"></a>
<span class="sourceLineNo">2787</span>      rpcServices.requestCount.reset();<a name="line.2787"></a>
<span class="sourceLineNo">2788</span>      rpcServices.rpcGetRequestCount.reset();<a name="line.2788"></a>
<span class="sourceLineNo">2789</span>      rpcServices.rpcScanRequestCount.reset();<a name="line.2789"></a>
<span class="sourceLineNo">2790</span>      rpcServices.rpcMultiRequestCount.reset();<a name="line.2790"></a>
<span class="sourceLineNo">2791</span>      rpcServices.rpcMutateRequestCount.reset();<a name="line.2791"></a>
<span class="sourceLineNo">2792</span>      LOG.info("reportForDuty to master=" + masterServerName + " with port="<a name="line.2792"></a>
<span class="sourceLineNo">2793</span>        + rpcServices.isa.getPort() + ", startcode=" + this.startcode);<a name="line.2793"></a>
<span class="sourceLineNo">2794</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2794"></a>
<span class="sourceLineNo">2795</span>      int port = rpcServices.isa.getPort();<a name="line.2795"></a>
<span class="sourceLineNo">2796</span>      RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder();<a name="line.2796"></a>
<span class="sourceLineNo">2797</span>      if (!StringUtils.isBlank(useThisHostnameInstead)) {<a name="line.2797"></a>
<span class="sourceLineNo">2798</span>        request.setUseThisHostnameInstead(useThisHostnameInstead);<a name="line.2798"></a>
<span class="sourceLineNo">2799</span>      }<a name="line.2799"></a>
<span class="sourceLineNo">2800</span>      request.setPort(port);<a name="line.2800"></a>
<span class="sourceLineNo">2801</span>      request.setServerStartCode(this.startcode);<a name="line.2801"></a>
<span class="sourceLineNo">2802</span>      request.setServerCurrentTime(now);<a name="line.2802"></a>
<span class="sourceLineNo">2803</span>      result = rss.regionServerStartup(null, request.build());<a name="line.2803"></a>
<span class="sourceLineNo">2804</span>    } catch (ServiceException se) {<a name="line.2804"></a>
<span class="sourceLineNo">2805</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.2805"></a>
<span class="sourceLineNo">2806</span>      if (ioe instanceof ClockOutOfSyncException) {<a name="line.2806"></a>
<span class="sourceLineNo">2807</span>        LOG.error(HBaseMarkers.FATAL, "Master rejected startup because clock is out of sync",<a name="line.2807"></a>
<span class="sourceLineNo">2808</span>            ioe);<a name="line.2808"></a>
<span class="sourceLineNo">2809</span>        // Re-throw IOE will cause RS to abort<a name="line.2809"></a>
<span class="sourceLineNo">2810</span>        throw ioe;<a name="line.2810"></a>
<span class="sourceLineNo">2811</span>      } else if (ioe instanceof ServerNotRunningYetException) {<a name="line.2811"></a>
<span class="sourceLineNo">2812</span>        LOG.debug("Master is not running yet");<a name="line.2812"></a>
<span class="sourceLineNo">2813</span>      } else {<a name="line.2813"></a>
<span class="sourceLineNo">2814</span>        LOG.warn("error telling master we are up", se);<a name="line.2814"></a>
<span class="sourceLineNo">2815</span>      }<a name="line.2815"></a>
<span class="sourceLineNo">2816</span>      rssStub = null;<a name="line.2816"></a>
<span class="sourceLineNo">2817</span>    }<a name="line.2817"></a>
<span class="sourceLineNo">2818</span>    return result;<a name="line.2818"></a>
<span class="sourceLineNo">2819</span>  }<a name="line.2819"></a>
<span class="sourceLineNo">2820</span><a name="line.2820"></a>
<span class="sourceLineNo">2821</span>  @Override<a name="line.2821"></a>
<span class="sourceLineNo">2822</span>  public RegionStoreSequenceIds getLastSequenceId(byte[] encodedRegionName) {<a name="line.2822"></a>
<span class="sourceLineNo">2823</span>    try {<a name="line.2823"></a>
<span class="sourceLineNo">2824</span>      GetLastFlushedSequenceIdRequest req =<a name="line.2824"></a>
<span class="sourceLineNo">2825</span>          RequestConverter.buildGetLastFlushedSequenceIdRequest(encodedRegionName);<a name="line.2825"></a>
<span class="sourceLineNo">2826</span>      RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.2826"></a>
<span class="sourceLineNo">2827</span>      if (rss == null) { // Try to connect one more time<a name="line.2827"></a>
<span class="sourceLineNo">2828</span>        createRegionServerStatusStub();<a name="line.2828"></a>
<span class="sourceLineNo">2829</span>        rss = rssStub;<a name="line.2829"></a>
<span class="sourceLineNo">2830</span>        if (rss == null) {<a name="line.2830"></a>
<span class="sourceLineNo">2831</span>          // Still no luck, we tried<a name="line.2831"></a>
<span class="sourceLineNo">2832</span>          LOG.warn("Unable to connect to the master to check " + "the last flushed sequence id");<a name="line.2832"></a>
<span class="sourceLineNo">2833</span>          return RegionStoreSequenceIds.newBuilder().setLastFlushedSequenceId(HConstants.NO_SEQNUM)<a name="line.2833"></a>
<span class="sourceLineNo">2834</span>              .build();<a name="line.2834"></a>
<span class="sourceLineNo">2835</span>        }<a name="line.2835"></a>
<span class="sourceLineNo">2836</span>      }<a name="line.2836"></a>
<span class="sourceLineNo">2837</span>      GetLastFlushedSequenceIdResponse resp = rss.getLastFlushedSequenceId(null, req);<a name="line.2837"></a>
<span class="sourceLineNo">2838</span>      return RegionStoreSequenceIds.newBuilder()<a name="line.2838"></a>
<span class="sourceLineNo">2839</span>          .setLastFlushedSequenceId(resp.getLastFlushedSequenceId())<a name="line.2839"></a>
<span class="sourceLineNo">2840</span>          .addAllStoreSequenceId(resp.getStoreLastFlushedSequenceIdList()).build();<a name="line.2840"></a>
<span class="sourceLineNo">2841</span>    } catch (ServiceException e) {<a name="line.2841"></a>
<span class="sourceLineNo">2842</span>      LOG.warn("Unable to connect to the master to check the last flushed sequence id", e);<a name="line.2842"></a>
<span class="sourceLineNo">2843</span>      return RegionStoreSequenceIds.newBuilder().setLastFlushedSequenceId(HConstants.NO_SEQNUM)<a name="line.2843"></a>
<span class="sourceLineNo">2844</span>          .build();<a name="line.2844"></a>
<span class="sourceLineNo">2845</span>    }<a name="line.2845"></a>
<span class="sourceLineNo">2846</span>  }<a name="line.2846"></a>
<span class="sourceLineNo">2847</span><a name="line.2847"></a>
<span class="sourceLineNo">2848</span>  /**<a name="line.2848"></a>
<span class="sourceLineNo">2849</span>   * Close meta region if we carry it<a name="line.2849"></a>
<span class="sourceLineNo">2850</span>   * @param abort Whether we're running an abort.<a name="line.2850"></a>
<span class="sourceLineNo">2851</span>   */<a name="line.2851"></a>
<span class="sourceLineNo">2852</span>  private void closeMetaTableRegions(final boolean abort) {<a name="line.2852"></a>
<span class="sourceLineNo">2853</span>    HRegion meta = null;<a name="line.2853"></a>
<span class="sourceLineNo">2854</span>    this.onlineRegionsLock.writeLock().lock();<a name="line.2854"></a>
<span class="sourceLineNo">2855</span>    try {<a name="line.2855"></a>
<span class="sourceLineNo">2856</span>      for (Map.Entry&lt;String, HRegion&gt; e: onlineRegions.entrySet()) {<a name="line.2856"></a>
<span class="sourceLineNo">2857</span>        RegionInfo hri = e.getValue().getRegionInfo();<a name="line.2857"></a>
<span class="sourceLineNo">2858</span>        if (hri.isMetaRegion()) {<a name="line.2858"></a>
<span class="sourceLineNo">2859</span>          meta = e.getValue();<a name="line.2859"></a>
<span class="sourceLineNo">2860</span>        }<a name="line.2860"></a>
<span class="sourceLineNo">2861</span>        if (meta != null) break;<a name="line.2861"></a>
<span class="sourceLineNo">2862</span>      }<a name="line.2862"></a>
<span class="sourceLineNo">2863</span>    } finally {<a name="line.2863"></a>
<span class="sourceLineNo">2864</span>      this.onlineRegionsLock.writeLock().unlock();<a name="line.2864"></a>
<span class="sourceLineNo">2865</span>    }<a name="line.2865"></a>
<span class="sourceLineNo">2866</span>    if (meta != null) closeRegionIgnoreErrors(meta.getRegionInfo(), abort);<a name="line.2866"></a>
<span class="sourceLineNo">2867</span>  }<a name="line.2867"></a>
<span class="sourceLineNo">2868</span><a name="line.2868"></a>
<span class="sourceLineNo">2869</span>  /**<a name="line.2869"></a>
<span class="sourceLineNo">2870</span>   * Schedule closes on all user regions.<a name="line.2870"></a>
<span class="sourceLineNo">2871</span>   * Should be safe calling multiple times because it wont' close regions<a name="line.2871"></a>
<span class="sourceLineNo">2872</span>   * that are already closed or that are closing.<a name="line.2872"></a>
<span class="sourceLineNo">2873</span>   * @param abort Whether we're running an abort.<a name="line.2873"></a>
<span class="sourceLineNo">2874</span>   */<a name="line.2874"></a>
<span class="sourceLineNo">2875</span>  private void closeUserRegions(final boolean abort) {<a name="line.2875"></a>
<span class="sourceLineNo">2876</span>    this.onlineRegionsLock.writeLock().lock();<a name="line.2876"></a>
<span class="sourceLineNo">2877</span>    try {<a name="line.2877"></a>
<span class="sourceLineNo">2878</span>      for (Map.Entry&lt;String, HRegion&gt; e: this.onlineRegions.entrySet()) {<a name="line.2878"></a>
<span class="sourceLineNo">2879</span>        HRegion r = e.getValue();<a name="line.2879"></a>
<span class="sourceLineNo">2880</span>        if (!r.getRegionInfo().isMetaRegion() &amp;&amp; r.isAvailable()) {<a name="line.2880"></a>
<span class="sourceLineNo">2881</span>          // Don't update zk with this close transition; pass false.<a name="line.2881"></a>
<span class="sourceLineNo">2882</span>          closeRegionIgnoreErrors(r.getRegionInfo(), abort);<a name="line.2882"></a>
<span class="sourceLineNo">2883</span>        }<a name="line.2883"></a>
<span class="sourceLineNo">2884</span>      }<a name="line.2884"></a>
<span class="sourceLineNo">2885</span>    } finally {<a name="line.2885"></a>
<span class="sourceLineNo">2886</span>      this.onlineRegionsLock.writeLock().unlock();<a name="line.2886"></a>
<span class="sourceLineNo">2887</span>    }<a name="line.2887"></a>
<span class="sourceLineNo">2888</span>  }<a name="line.2888"></a>
<span class="sourceLineNo">2889</span><a name="line.2889"></a>
<span class="sourceLineNo">2890</span>  /** @return the info server */<a name="line.2890"></a>
<span class="sourceLineNo">2891</span>  public InfoServer getInfoServer() {<a name="line.2891"></a>
<span class="sourceLineNo">2892</span>    return infoServer;<a name="line.2892"></a>
<span class="sourceLineNo">2893</span>  }<a name="line.2893"></a>
<span class="sourceLineNo">2894</span><a name="line.2894"></a>
<span class="sourceLineNo">2895</span>  /**<a name="line.2895"></a>
<span class="sourceLineNo">2896</span>   * @return true if a stop has been requested.<a name="line.2896"></a>
<span class="sourceLineNo">2897</span>   */<a name="line.2897"></a>
<span class="sourceLineNo">2898</span>  @Override<a name="line.2898"></a>
<span class="sourceLineNo">2899</span>  public boolean isStopped() {<a name="line.2899"></a>
<span class="sourceLineNo">2900</span>    return this.stopped;<a name="line.2900"></a>
<span class="sourceLineNo">2901</span>  }<a name="line.2901"></a>
<span class="sourceLineNo">2902</span><a name="line.2902"></a>
<span class="sourceLineNo">2903</span>  @Override<a name="line.2903"></a>
<span class="sourceLineNo">2904</span>  public boolean isStopping() {<a name="line.2904"></a>
<span class="sourceLineNo">2905</span>    return this.stopping;<a name="line.2905"></a>
<span class="sourceLineNo">2906</span>  }<a name="line.2906"></a>
<span class="sourceLineNo">2907</span><a name="line.2907"></a>
<span class="sourceLineNo">2908</span>  @Override<a name="line.2908"></a>
<span class="sourceLineNo">2909</span>  public Configuration getConfiguration() {<a name="line.2909"></a>
<span class="sourceLineNo">2910</span>    return conf;<a name="line.2910"></a>
<span class="sourceLineNo">2911</span>  }<a name="line.2911"></a>
<span class="sourceLineNo">2912</span><a name="line.2912"></a>
<span class="sourceLineNo">2913</span>  protected Map&lt;String, HRegion&gt; getOnlineRegions() {<a name="line.2913"></a>
<span class="sourceLineNo">2914</span>    return this.onlineRegions;<a name="line.2914"></a>
<span class="sourceLineNo">2915</span>  }<a name="line.2915"></a>
<span class="sourceLineNo">2916</span><a name="line.2916"></a>
<span class="sourceLineNo">2917</span>  public int getNumberOfOnlineRegions() {<a name="line.2917"></a>
<span class="sourceLineNo">2918</span>    return this.onlineRegions.size();<a name="line.2918"></a>
<span class="sourceLineNo">2919</span>  }<a name="line.2919"></a>
<span class="sourceLineNo">2920</span><a name="line.2920"></a>
<span class="sourceLineNo">2921</span>  /**<a name="line.2921"></a>
<span class="sourceLineNo">2922</span>   * For tests, web ui and metrics.<a name="line.2922"></a>
<span class="sourceLineNo">2923</span>   * This method will only work if HRegionServer is in the same JVM as client;<a name="line.2923"></a>
<span class="sourceLineNo">2924</span>   * HRegion cannot be serialized to cross an rpc.<a name="line.2924"></a>
<span class="sourceLineNo">2925</span>   */<a name="line.2925"></a>
<span class="sourceLineNo">2926</span>  public Collection&lt;HRegion&gt; getOnlineRegionsLocalContext() {<a name="line.2926"></a>
<span class="sourceLineNo">2927</span>    Collection&lt;HRegion&gt; regions = this.onlineRegions.values();<a name="line.2927"></a>
<span class="sourceLineNo">2928</span>    return Collections.unmodifiableCollection(regions);<a name="line.2928"></a>
<span class="sourceLineNo">2929</span>  }<a name="line.2929"></a>
<span class="sourceLineNo">2930</span><a name="line.2930"></a>
<span class="sourceLineNo">2931</span>  @Override<a name="line.2931"></a>
<span class="sourceLineNo">2932</span>  public void addRegion(HRegion region) {<a name="line.2932"></a>
<span class="sourceLineNo">2933</span>    this.onlineRegions.put(region.getRegionInfo().getEncodedName(), region);<a name="line.2933"></a>
<span class="sourceLineNo">2934</span>    configurationManager.registerObserver(region);<a name="line.2934"></a>
<span class="sourceLineNo">2935</span>  }<a name="line.2935"></a>
<span class="sourceLineNo">2936</span><a name="line.2936"></a>
<span class="sourceLineNo">2937</span>  private void addRegion(SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; sortedRegions, HRegion region,<a name="line.2937"></a>
<span class="sourceLineNo">2938</span>      long size) {<a name="line.2938"></a>
<span class="sourceLineNo">2939</span>    if (!sortedRegions.containsKey(size)) {<a name="line.2939"></a>
<span class="sourceLineNo">2940</span>      sortedRegions.put(size, new ArrayList&lt;&gt;());<a name="line.2940"></a>
<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
<span class="sourceLineNo">2942</span>    sortedRegions.get(size).add(region);<a name="line.2942"></a>
<span class="sourceLineNo">2943</span>  }<a name="line.2943"></a>
<span class="sourceLineNo">2944</span>  /**<a name="line.2944"></a>
<span class="sourceLineNo">2945</span>   * @return A new Map of online regions sorted by region off-heap size with the first entry being<a name="line.2945"></a>
<span class="sourceLineNo">2946</span>   *   the biggest.<a name="line.2946"></a>
<span class="sourceLineNo">2947</span>   */<a name="line.2947"></a>
<span class="sourceLineNo">2948</span>  SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; getCopyOfOnlineRegionsSortedByOffHeapSize() {<a name="line.2948"></a>
<span class="sourceLineNo">2949</span>    // we'll sort the regions in reverse<a name="line.2949"></a>
<span class="sourceLineNo">2950</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; sortedRegions = new TreeMap&lt;&gt;(Comparator.reverseOrder());<a name="line.2950"></a>
<span class="sourceLineNo">2951</span>    // Copy over all regions. Regions are sorted by size with biggest first.<a name="line.2951"></a>
<span class="sourceLineNo">2952</span>    for (HRegion region : this.onlineRegions.values()) {<a name="line.2952"></a>
<span class="sourceLineNo">2953</span>      addRegion(sortedRegions, region, region.getMemStoreOffHeapSize());<a name="line.2953"></a>
<span class="sourceLineNo">2954</span>    }<a name="line.2954"></a>
<span class="sourceLineNo">2955</span>    return sortedRegions;<a name="line.2955"></a>
<span class="sourceLineNo">2956</span>  }<a name="line.2956"></a>
<span class="sourceLineNo">2957</span><a name="line.2957"></a>
<span class="sourceLineNo">2958</span>  /**<a name="line.2958"></a>
<span class="sourceLineNo">2959</span>   * @return A new Map of online regions sorted by region heap size with the first entry being the<a name="line.2959"></a>
<span class="sourceLineNo">2960</span>   *   biggest.<a name="line.2960"></a>
<span class="sourceLineNo">2961</span>   */<a name="line.2961"></a>
<span class="sourceLineNo">2962</span>  SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; getCopyOfOnlineRegionsSortedByOnHeapSize() {<a name="line.2962"></a>
<span class="sourceLineNo">2963</span>    // we'll sort the regions in reverse<a name="line.2963"></a>
<span class="sourceLineNo">2964</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; sortedRegions = new TreeMap&lt;&gt;(Comparator.reverseOrder());<a name="line.2964"></a>
<span class="sourceLineNo">2965</span>    // Copy over all regions. Regions are sorted by size with biggest first.<a name="line.2965"></a>
<span class="sourceLineNo">2966</span>    for (HRegion region : this.onlineRegions.values()) {<a name="line.2966"></a>
<span class="sourceLineNo">2967</span>      addRegion(sortedRegions, region, region.getMemStoreHeapSize());<a name="line.2967"></a>
<span class="sourceLineNo">2968</span>    }<a name="line.2968"></a>
<span class="sourceLineNo">2969</span>    return sortedRegions;<a name="line.2969"></a>
<span class="sourceLineNo">2970</span>  }<a name="line.2970"></a>
<span class="sourceLineNo">2971</span><a name="line.2971"></a>
<span class="sourceLineNo">2972</span>  /**<a name="line.2972"></a>
<span class="sourceLineNo">2973</span>   * @return time stamp in millis of when this region server was started<a name="line.2973"></a>
<span class="sourceLineNo">2974</span>   */<a name="line.2974"></a>
<span class="sourceLineNo">2975</span>  public long getStartcode() {<a name="line.2975"></a>
<span class="sourceLineNo">2976</span>    return this.startcode;<a name="line.2976"></a>
<span class="sourceLineNo">2977</span>  }<a name="line.2977"></a>
<span class="sourceLineNo">2978</span><a name="line.2978"></a>
<span class="sourceLineNo">2979</span>  /** @return reference to FlushRequester */<a name="line.2979"></a>
<span class="sourceLineNo">2980</span>  @Override<a name="line.2980"></a>
<span class="sourceLineNo">2981</span>  public FlushRequester getFlushRequester() {<a name="line.2981"></a>
<span class="sourceLineNo">2982</span>    return this.cacheFlusher;<a name="line.2982"></a>
<span class="sourceLineNo">2983</span>  }<a name="line.2983"></a>
<span class="sourceLineNo">2984</span><a name="line.2984"></a>
<span class="sourceLineNo">2985</span>  @Override<a name="line.2985"></a>
<span class="sourceLineNo">2986</span>  public CompactionRequester getCompactionRequestor() {<a name="line.2986"></a>
<span class="sourceLineNo">2987</span>    return this.compactSplitThread;<a name="line.2987"></a>
<span class="sourceLineNo">2988</span>  }<a name="line.2988"></a>
<span class="sourceLineNo">2989</span><a name="line.2989"></a>
<span class="sourceLineNo">2990</span>  @Override<a name="line.2990"></a>
<span class="sourceLineNo">2991</span>  public LeaseManager getLeaseManager() {<a name="line.2991"></a>
<span class="sourceLineNo">2992</span>    return leaseManager;<a name="line.2992"></a>
<span class="sourceLineNo">2993</span>  }<a name="line.2993"></a>
<span class="sourceLineNo">2994</span><a name="line.2994"></a>
<span class="sourceLineNo">2995</span>  /**<a name="line.2995"></a>
<span class="sourceLineNo">2996</span>   * @return Return the rootDir.<a name="line.2996"></a>
<span class="sourceLineNo">2997</span>   */<a name="line.2997"></a>
<span class="sourceLineNo">2998</span>  protected Path getDataRootDir() {<a name="line.2998"></a>
<span class="sourceLineNo">2999</span>    return dataRootDir;<a name="line.2999"></a>
<span class="sourceLineNo">3000</span>  }<a name="line.3000"></a>
<span class="sourceLineNo">3001</span><a name="line.3001"></a>
<span class="sourceLineNo">3002</span>  @Override<a name="line.3002"></a>
<span class="sourceLineNo">3003</span>  public FileSystem getFileSystem() {<a name="line.3003"></a>
<span class="sourceLineNo">3004</span>    return dataFs;<a name="line.3004"></a>
<span class="sourceLineNo">3005</span>  }<a name="line.3005"></a>
<span class="sourceLineNo">3006</span><a name="line.3006"></a>
<span class="sourceLineNo">3007</span>  /**<a name="line.3007"></a>
<span class="sourceLineNo">3008</span>   * @return {@code true} when the data file system is available, {@code false} otherwise.<a name="line.3008"></a>
<span class="sourceLineNo">3009</span>   */<a name="line.3009"></a>
<span class="sourceLineNo">3010</span>  boolean isDataFileSystemOk() {<a name="line.3010"></a>
<span class="sourceLineNo">3011</span>    return this.dataFsOk;<a name="line.3011"></a>
<span class="sourceLineNo">3012</span>  }<a name="line.3012"></a>
<span class="sourceLineNo">3013</span><a name="line.3013"></a>
<span class="sourceLineNo">3014</span>  /**<a name="line.3014"></a>
<span class="sourceLineNo">3015</span>   * @return Return the walRootDir.<a name="line.3015"></a>
<span class="sourceLineNo">3016</span>   */<a name="line.3016"></a>
<span class="sourceLineNo">3017</span>  public Path getWALRootDir() {<a name="line.3017"></a>
<span class="sourceLineNo">3018</span>    return walRootDir;<a name="line.3018"></a>
<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
<span class="sourceLineNo">3020</span><a name="line.3020"></a>
<span class="sourceLineNo">3021</span>  /**<a name="line.3021"></a>
<span class="sourceLineNo">3022</span>   * @return Return the walFs.<a name="line.3022"></a>
<span class="sourceLineNo">3023</span>   */<a name="line.3023"></a>
<span class="sourceLineNo">3024</span>  public FileSystem getWALFileSystem() {<a name="line.3024"></a>
<span class="sourceLineNo">3025</span>    return walFs;<a name="line.3025"></a>
<span class="sourceLineNo">3026</span>  }<a name="line.3026"></a>
<span class="sourceLineNo">3027</span><a name="line.3027"></a>
<span class="sourceLineNo">3028</span>  @Override<a name="line.3028"></a>
<span class="sourceLineNo">3029</span>  public String toString() {<a name="line.3029"></a>
<span class="sourceLineNo">3030</span>    return getServerName().toString();<a name="line.3030"></a>
<span class="sourceLineNo">3031</span>  }<a name="line.3031"></a>
<span class="sourceLineNo">3032</span><a name="line.3032"></a>
<span class="sourceLineNo">3033</span>  @Override<a name="line.3033"></a>
<span class="sourceLineNo">3034</span>  public ZKWatcher getZooKeeper() {<a name="line.3034"></a>
<span class="sourceLineNo">3035</span>    return zooKeeper;<a name="line.3035"></a>
<span class="sourceLineNo">3036</span>  }<a name="line.3036"></a>
<span class="sourceLineNo">3037</span><a name="line.3037"></a>
<span class="sourceLineNo">3038</span>  @Override<a name="line.3038"></a>
<span class="sourceLineNo">3039</span>  public CoordinatedStateManager getCoordinatedStateManager() {<a name="line.3039"></a>
<span class="sourceLineNo">3040</span>    return csm;<a name="line.3040"></a>
<span class="sourceLineNo">3041</span>  }<a name="line.3041"></a>
<span class="sourceLineNo">3042</span><a name="line.3042"></a>
<span class="sourceLineNo">3043</span>  @Override<a name="line.3043"></a>
<span class="sourceLineNo">3044</span>  public ServerName getServerName() {<a name="line.3044"></a>
<span class="sourceLineNo">3045</span>    return serverName;<a name="line.3045"></a>
<span class="sourceLineNo">3046</span>  }<a name="line.3046"></a>
<span class="sourceLineNo">3047</span><a name="line.3047"></a>
<span class="sourceLineNo">3048</span>  public RegionServerCoprocessorHost getRegionServerCoprocessorHost(){<a name="line.3048"></a>
<span class="sourceLineNo">3049</span>    return this.rsHost;<a name="line.3049"></a>
<span class="sourceLineNo">3050</span>  }<a name="line.3050"></a>
<span class="sourceLineNo">3051</span><a name="line.3051"></a>
<span class="sourceLineNo">3052</span>  @Override<a name="line.3052"></a>
<span class="sourceLineNo">3053</span>  public ConcurrentMap&lt;byte[], Boolean&gt; getRegionsInTransitionInRS() {<a name="line.3053"></a>
<span class="sourceLineNo">3054</span>    return this.regionsInTransitionInRS;<a name="line.3054"></a>
<span class="sourceLineNo">3055</span>  }<a name="line.3055"></a>
<span class="sourceLineNo">3056</span><a name="line.3056"></a>
<span class="sourceLineNo">3057</span>  @Override<a name="line.3057"></a>
<span class="sourceLineNo">3058</span>  public ExecutorService getExecutorService() {<a name="line.3058"></a>
<span class="sourceLineNo">3059</span>    return executorService;<a name="line.3059"></a>
<span class="sourceLineNo">3060</span>  }<a name="line.3060"></a>
<span class="sourceLineNo">3061</span><a name="line.3061"></a>
<span class="sourceLineNo">3062</span>  @Override<a name="line.3062"></a>
<span class="sourceLineNo">3063</span>  public ChoreService getChoreService() {<a name="line.3063"></a>
<span class="sourceLineNo">3064</span>    return choreService;<a name="line.3064"></a>
<span class="sourceLineNo">3065</span>  }<a name="line.3065"></a>
<span class="sourceLineNo">3066</span><a name="line.3066"></a>
<span class="sourceLineNo">3067</span>  @Override<a name="line.3067"></a>
<span class="sourceLineNo">3068</span>  public RegionServerRpcQuotaManager getRegionServerRpcQuotaManager() {<a name="line.3068"></a>
<span class="sourceLineNo">3069</span>    return rsQuotaManager;<a name="line.3069"></a>
<span class="sourceLineNo">3070</span>  }<a name="line.3070"></a>
<span class="sourceLineNo">3071</span><a name="line.3071"></a>
<span class="sourceLineNo">3072</span>  //<a name="line.3072"></a>
<span class="sourceLineNo">3073</span>  // Main program and support routines<a name="line.3073"></a>
<span class="sourceLineNo">3074</span>  //<a name="line.3074"></a>
<span class="sourceLineNo">3075</span>  /**<a name="line.3075"></a>
<span class="sourceLineNo">3076</span>   * Load the replication executorService objects, if any<a name="line.3076"></a>
<span class="sourceLineNo">3077</span>   */<a name="line.3077"></a>
<span class="sourceLineNo">3078</span>  private static void createNewReplicationInstance(Configuration conf, HRegionServer server,<a name="line.3078"></a>
<span class="sourceLineNo">3079</span>      FileSystem walFs, Path walDir, Path oldWALDir, WALProvider walProvider) throws IOException {<a name="line.3079"></a>
<span class="sourceLineNo">3080</span>    // read in the name of the source replication class from the config file.<a name="line.3080"></a>
<span class="sourceLineNo">3081</span>    String sourceClassname = conf.get(HConstants.REPLICATION_SOURCE_SERVICE_CLASSNAME,<a name="line.3081"></a>
<span class="sourceLineNo">3082</span>      HConstants.REPLICATION_SERVICE_CLASSNAME_DEFAULT);<a name="line.3082"></a>
<span class="sourceLineNo">3083</span><a name="line.3083"></a>
<span class="sourceLineNo">3084</span>    // read in the name of the sink replication class from the config file.<a name="line.3084"></a>
<span class="sourceLineNo">3085</span>    String sinkClassname = conf.get(HConstants.REPLICATION_SINK_SERVICE_CLASSNAME,<a name="line.3085"></a>
<span class="sourceLineNo">3086</span>      HConstants.REPLICATION_SINK_SERVICE_CLASSNAME_DEFAULT);<a name="line.3086"></a>
<span class="sourceLineNo">3087</span><a name="line.3087"></a>
<span class="sourceLineNo">3088</span>    // If both the sink and the source class names are the same, then instantiate<a name="line.3088"></a>
<span class="sourceLineNo">3089</span>    // only one object.<a name="line.3089"></a>
<span class="sourceLineNo">3090</span>    if (sourceClassname.equals(sinkClassname)) {<a name="line.3090"></a>
<span class="sourceLineNo">3091</span>      server.replicationSourceHandler = newReplicationInstance(sourceClassname,<a name="line.3091"></a>
<span class="sourceLineNo">3092</span>        ReplicationSourceService.class, conf, server, walFs, walDir, oldWALDir, walProvider);<a name="line.3092"></a>
<span class="sourceLineNo">3093</span>      server.replicationSinkHandler = (ReplicationSinkService) server.replicationSourceHandler;<a name="line.3093"></a>
<span class="sourceLineNo">3094</span>      server.sameReplicationSourceAndSink = true;<a name="line.3094"></a>
<span class="sourceLineNo">3095</span>    } else {<a name="line.3095"></a>
<span class="sourceLineNo">3096</span>      server.replicationSourceHandler = newReplicationInstance(sourceClassname,<a name="line.3096"></a>
<span class="sourceLineNo">3097</span>        ReplicationSourceService.class, conf, server, walFs, walDir, oldWALDir, walProvider);<a name="line.3097"></a>
<span class="sourceLineNo">3098</span>      server.replicationSinkHandler = newReplicationInstance(sinkClassname,<a name="line.3098"></a>
<span class="sourceLineNo">3099</span>        ReplicationSinkService.class, conf, server, walFs, walDir, oldWALDir, walProvider);<a name="line.3099"></a>
<span class="sourceLineNo">3100</span>      server.sameReplicationSourceAndSink = false;<a name="line.3100"></a>
<span class="sourceLineNo">3101</span>    }<a name="line.3101"></a>
<span class="sourceLineNo">3102</span>  }<a name="line.3102"></a>
<span class="sourceLineNo">3103</span><a name="line.3103"></a>
<span class="sourceLineNo">3104</span>  private static &lt;T extends ReplicationService&gt; T newReplicationInstance(String classname,<a name="line.3104"></a>
<span class="sourceLineNo">3105</span>      Class&lt;T&gt; xface, Configuration conf, HRegionServer server, FileSystem walFs, Path logDir,<a name="line.3105"></a>
<span class="sourceLineNo">3106</span>      Path oldLogDir, WALProvider walProvider) throws IOException {<a name="line.3106"></a>
<span class="sourceLineNo">3107</span>    final Class&lt;? extends T&gt; clazz;<a name="line.3107"></a>
<span class="sourceLineNo">3108</span>    try {<a name="line.3108"></a>
<span class="sourceLineNo">3109</span>      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();<a name="line.3109"></a>
<span class="sourceLineNo">3110</span>      clazz = Class.forName(classname, true, classLoader).asSubclass(xface);<a name="line.3110"></a>
<span class="sourceLineNo">3111</span>    } catch (java.lang.ClassNotFoundException nfe) {<a name="line.3111"></a>
<span class="sourceLineNo">3112</span>      throw new IOException("Could not find class for " + classname);<a name="line.3112"></a>
<span class="sourceLineNo">3113</span>    }<a name="line.3113"></a>
<span class="sourceLineNo">3114</span>    T service = ReflectionUtils.newInstance(clazz, conf);<a name="line.3114"></a>
<span class="sourceLineNo">3115</span>    service.initialize(server, walFs, logDir, oldLogDir, walProvider);<a name="line.3115"></a>
<span class="sourceLineNo">3116</span>    return service;<a name="line.3116"></a>
<span class="sourceLineNo">3117</span>  }<a name="line.3117"></a>
<span class="sourceLineNo">3118</span><a name="line.3118"></a>
<span class="sourceLineNo">3119</span>  public Map&lt;String, ReplicationStatus&gt; getWalGroupsReplicationStatus(){<a name="line.3119"></a>
<span class="sourceLineNo">3120</span>    Map&lt;String, ReplicationStatus&gt; walGroupsReplicationStatus = new TreeMap&lt;&gt;();<a name="line.3120"></a>
<span class="sourceLineNo">3121</span>    if(!this.isOnline()){<a name="line.3121"></a>
<span class="sourceLineNo">3122</span>      return walGroupsReplicationStatus;<a name="line.3122"></a>
<span class="sourceLineNo">3123</span>    }<a name="line.3123"></a>
<span class="sourceLineNo">3124</span>    List&lt;ReplicationSourceInterface&gt; allSources = new ArrayList&lt;&gt;();<a name="line.3124"></a>
<span class="sourceLineNo">3125</span>    allSources.addAll(replicationSourceHandler.getReplicationManager().getSources());<a name="line.3125"></a>
<span class="sourceLineNo">3126</span>    allSources.addAll(replicationSourceHandler.getReplicationManager().getOldSources());<a name="line.3126"></a>
<span class="sourceLineNo">3127</span>    for(ReplicationSourceInterface source: allSources){<a name="line.3127"></a>
<span class="sourceLineNo">3128</span>      walGroupsReplicationStatus.putAll(source.getWalGroupStatus());<a name="line.3128"></a>
<span class="sourceLineNo">3129</span>    }<a name="line.3129"></a>
<span class="sourceLineNo">3130</span>    return walGroupsReplicationStatus;<a name="line.3130"></a>
<span class="sourceLineNo">3131</span>  }<a name="line.3131"></a>
<span class="sourceLineNo">3132</span><a name="line.3132"></a>
<span class="sourceLineNo">3133</span>  /**<a name="line.3133"></a>
<span class="sourceLineNo">3134</span>   * Utility for constructing an instance of the passed HRegionServer class.<a name="line.3134"></a>
<span class="sourceLineNo">3135</span>   */<a name="line.3135"></a>
<span class="sourceLineNo">3136</span>  static HRegionServer constructRegionServer(<a name="line.3136"></a>
<span class="sourceLineNo">3137</span>      final Class&lt;? extends HRegionServer&gt; regionServerClass,<a name="line.3137"></a>
<span class="sourceLineNo">3138</span>      final Configuration conf<a name="line.3138"></a>
<span class="sourceLineNo">3139</span>  ) {<a name="line.3139"></a>
<span class="sourceLineNo">3140</span>    try {<a name="line.3140"></a>
<span class="sourceLineNo">3141</span>      Constructor&lt;? extends HRegionServer&gt; c =<a name="line.3141"></a>
<span class="sourceLineNo">3142</span>          regionServerClass.getConstructor(Configuration.class);<a name="line.3142"></a>
<span class="sourceLineNo">3143</span>      return c.newInstance(conf);<a name="line.3143"></a>
<span class="sourceLineNo">3144</span>    } catch (Exception e) {<a name="line.3144"></a>
<span class="sourceLineNo">3145</span>      throw new RuntimeException("Failed construction of " + "Regionserver: "<a name="line.3145"></a>
<span class="sourceLineNo">3146</span>          + regionServerClass.toString(), e);<a name="line.3146"></a>
<span class="sourceLineNo">3147</span>    }<a name="line.3147"></a>
<span class="sourceLineNo">3148</span>  }<a name="line.3148"></a>
<span class="sourceLineNo">3149</span><a name="line.3149"></a>
<span class="sourceLineNo">3150</span>  /**<a name="line.3150"></a>
<span class="sourceLineNo">3151</span>   * @see org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine<a name="line.3151"></a>
<span class="sourceLineNo">3152</span>   */<a name="line.3152"></a>
<span class="sourceLineNo">3153</span>  public static void main(String[] args) {<a name="line.3153"></a>
<span class="sourceLineNo">3154</span>    LOG.info("STARTING executorService " + HRegionServer.class.getSimpleName());<a name="line.3154"></a>
<span class="sourceLineNo">3155</span>    VersionInfo.logVersion();<a name="line.3155"></a>
<span class="sourceLineNo">3156</span>    Configuration conf = HBaseConfiguration.create();<a name="line.3156"></a>
<span class="sourceLineNo">3157</span>    @SuppressWarnings("unchecked")<a name="line.3157"></a>
<span class="sourceLineNo">3158</span>    Class&lt;? extends HRegionServer&gt; regionServerClass = (Class&lt;? extends HRegionServer&gt;) conf<a name="line.3158"></a>
<span class="sourceLineNo">3159</span>        .getClass(HConstants.REGION_SERVER_IMPL, HRegionServer.class);<a name="line.3159"></a>
<span class="sourceLineNo">3160</span><a name="line.3160"></a>
<span class="sourceLineNo">3161</span>    new HRegionServerCommandLine(regionServerClass).doMain(args);<a name="line.3161"></a>
<span class="sourceLineNo">3162</span>  }<a name="line.3162"></a>
<span class="sourceLineNo">3163</span><a name="line.3163"></a>
<span class="sourceLineNo">3164</span>  /**<a name="line.3164"></a>
<span class="sourceLineNo">3165</span>   * Gets the online regions of the specified table.<a name="line.3165"></a>
<span class="sourceLineNo">3166</span>   * This method looks at the in-memory onlineRegions.  It does not go to &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.3166"></a>
<span class="sourceLineNo">3167</span>   * Only returns &lt;em&gt;online&lt;/em&gt; regions.  If a region on this table has been<a name="line.3167"></a>
<span class="sourceLineNo">3168</span>   * closed during a disable, etc., it will not be included in the returned list.<a name="line.3168"></a>
<span class="sourceLineNo">3169</span>   * So, the returned list may not necessarily be ALL regions in this table, its<a name="line.3169"></a>
<span class="sourceLineNo">3170</span>   * all the ONLINE regions in the table.<a name="line.3170"></a>
<span class="sourceLineNo">3171</span>   * @param tableName table to limit the scope of the query<a name="line.3171"></a>
<span class="sourceLineNo">3172</span>   * @return Online regions from &lt;code&gt;tableName&lt;/code&gt;<a name="line.3172"></a>
<span class="sourceLineNo">3173</span>   */<a name="line.3173"></a>
<span class="sourceLineNo">3174</span>  @Override<a name="line.3174"></a>
<span class="sourceLineNo">3175</span>  public List&lt;HRegion&gt; getRegions(TableName tableName) {<a name="line.3175"></a>
<span class="sourceLineNo">3176</span>     List&lt;HRegion&gt; tableRegions = new ArrayList&lt;&gt;();<a name="line.3176"></a>
<span class="sourceLineNo">3177</span>     synchronized (this.onlineRegions) {<a name="line.3177"></a>
<span class="sourceLineNo">3178</span>       for (HRegion region: this.onlineRegions.values()) {<a name="line.3178"></a>
<span class="sourceLineNo">3179</span>         RegionInfo regionInfo = region.getRegionInfo();<a name="line.3179"></a>
<span class="sourceLineNo">3180</span>         if(regionInfo.getTable().equals(tableName)) {<a name="line.3180"></a>
<span class="sourceLineNo">3181</span>           tableRegions.add(region);<a name="line.3181"></a>
<span class="sourceLineNo">3182</span>         }<a name="line.3182"></a>
<span class="sourceLineNo">3183</span>       }<a name="line.3183"></a>
<span class="sourceLineNo">3184</span>     }<a name="line.3184"></a>
<span class="sourceLineNo">3185</span>     return tableRegions;<a name="line.3185"></a>
<span class="sourceLineNo">3186</span>   }<a name="line.3186"></a>
<span class="sourceLineNo">3187</span><a name="line.3187"></a>
<span class="sourceLineNo">3188</span>  @Override<a name="line.3188"></a>
<span class="sourceLineNo">3189</span>  public List&lt;HRegion&gt; getRegions() {<a name="line.3189"></a>
<span class="sourceLineNo">3190</span>    List&lt;HRegion&gt; allRegions;<a name="line.3190"></a>
<span class="sourceLineNo">3191</span>    synchronized (this.onlineRegions) {<a name="line.3191"></a>
<span class="sourceLineNo">3192</span>      // Return a clone copy of the onlineRegions<a name="line.3192"></a>
<span class="sourceLineNo">3193</span>      allRegions = new ArrayList&lt;&gt;(onlineRegions.values());<a name="line.3193"></a>
<span class="sourceLineNo">3194</span>    }<a name="line.3194"></a>
<span class="sourceLineNo">3195</span>    return allRegions;<a name="line.3195"></a>
<span class="sourceLineNo">3196</span>  }<a name="line.3196"></a>
<span class="sourceLineNo">3197</span><a name="line.3197"></a>
<span class="sourceLineNo">3198</span>  /**<a name="line.3198"></a>
<span class="sourceLineNo">3199</span>   * Gets the online tables in this RS.<a name="line.3199"></a>
<span class="sourceLineNo">3200</span>   * This method looks at the in-memory onlineRegions.<a name="line.3200"></a>
<span class="sourceLineNo">3201</span>   * @return all the online tables in this RS<a name="line.3201"></a>
<span class="sourceLineNo">3202</span>   */<a name="line.3202"></a>
<span class="sourceLineNo">3203</span>  public Set&lt;TableName&gt; getOnlineTables() {<a name="line.3203"></a>
<span class="sourceLineNo">3204</span>    Set&lt;TableName&gt; tables = new HashSet&lt;&gt;();<a name="line.3204"></a>
<span class="sourceLineNo">3205</span>    synchronized (this.onlineRegions) {<a name="line.3205"></a>
<span class="sourceLineNo">3206</span>      for (Region region: this.onlineRegions.values()) {<a name="line.3206"></a>
<span class="sourceLineNo">3207</span>        tables.add(region.getTableDescriptor().getTableName());<a name="line.3207"></a>
<span class="sourceLineNo">3208</span>      }<a name="line.3208"></a>
<span class="sourceLineNo">3209</span>    }<a name="line.3209"></a>
<span class="sourceLineNo">3210</span>    return tables;<a name="line.3210"></a>
<span class="sourceLineNo">3211</span>  }<a name="line.3211"></a>
<span class="sourceLineNo">3212</span><a name="line.3212"></a>
<span class="sourceLineNo">3213</span>  public String[] getRegionServerCoprocessors() {<a name="line.3213"></a>
<span class="sourceLineNo">3214</span>    TreeSet&lt;String&gt; coprocessors = new TreeSet&lt;&gt;();<a name="line.3214"></a>
<span class="sourceLineNo">3215</span>    try {<a name="line.3215"></a>
<span class="sourceLineNo">3216</span>      coprocessors.addAll(getWAL(null).getCoprocessorHost().getCoprocessors());<a name="line.3216"></a>
<span class="sourceLineNo">3217</span>    } catch (IOException exception) {<a name="line.3217"></a>
<span class="sourceLineNo">3218</span>      LOG.warn("Exception attempting to fetch wal coprocessor information for the common wal; " +<a name="line.3218"></a>
<span class="sourceLineNo">3219</span>          "skipping.");<a name="line.3219"></a>
<span class="sourceLineNo">3220</span>      LOG.debug("Exception details for failure to fetch wal coprocessor information.", exception);<a name="line.3220"></a>
<span class="sourceLineNo">3221</span>    }<a name="line.3221"></a>
<span class="sourceLineNo">3222</span>    Collection&lt;HRegion&gt; regions = getOnlineRegionsLocalContext();<a name="line.3222"></a>
<span class="sourceLineNo">3223</span>    for (HRegion region: regions) {<a name="line.3223"></a>
<span class="sourceLineNo">3224</span>      coprocessors.addAll(region.getCoprocessorHost().getCoprocessors());<a name="line.3224"></a>
<span class="sourceLineNo">3225</span>      try {<a name="line.3225"></a>
<span class="sourceLineNo">3226</span>        coprocessors.addAll(getWAL(region.getRegionInfo()).getCoprocessorHost().getCoprocessors());<a name="line.3226"></a>
<span class="sourceLineNo">3227</span>      } catch (IOException exception) {<a name="line.3227"></a>
<span class="sourceLineNo">3228</span>        LOG.warn("Exception attempting to fetch wal coprocessor information for region " + region +<a name="line.3228"></a>
<span class="sourceLineNo">3229</span>            "; skipping.");<a name="line.3229"></a>
<span class="sourceLineNo">3230</span>        LOG.debug("Exception details for failure to fetch wal coprocessor information.", exception);<a name="line.3230"></a>
<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
<span class="sourceLineNo">3232</span>    }<a name="line.3232"></a>
<span class="sourceLineNo">3233</span>    coprocessors.addAll(rsHost.getCoprocessors());<a name="line.3233"></a>
<span class="sourceLineNo">3234</span>    return coprocessors.toArray(new String[0]);<a name="line.3234"></a>
<span class="sourceLineNo">3235</span>  }<a name="line.3235"></a>
<span class="sourceLineNo">3236</span><a name="line.3236"></a>
<span class="sourceLineNo">3237</span>  /**<a name="line.3237"></a>
<span class="sourceLineNo">3238</span>   * Try to close the region, logs a warning on failure but continues.<a name="line.3238"></a>
<span class="sourceLineNo">3239</span>   * @param region Region to close<a name="line.3239"></a>
<span class="sourceLineNo">3240</span>   */<a name="line.3240"></a>
<span class="sourceLineNo">3241</span>  private void closeRegionIgnoreErrors(RegionInfo region, final boolean abort) {<a name="line.3241"></a>
<span class="sourceLineNo">3242</span>    try {<a name="line.3242"></a>
<span class="sourceLineNo">3243</span>      if (!closeRegion(region.getEncodedName(), abort, null)) {<a name="line.3243"></a>
<span class="sourceLineNo">3244</span>        LOG.warn("Failed to close " + region.getRegionNameAsString() +<a name="line.3244"></a>
<span class="sourceLineNo">3245</span>            " - ignoring and continuing");<a name="line.3245"></a>
<span class="sourceLineNo">3246</span>      }<a name="line.3246"></a>
<span class="sourceLineNo">3247</span>    } catch (IOException e) {<a name="line.3247"></a>
<span class="sourceLineNo">3248</span>      LOG.warn("Failed to close " + region.getRegionNameAsString() +<a name="line.3248"></a>
<span class="sourceLineNo">3249</span>          " - ignoring and continuing", e);<a name="line.3249"></a>
<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
<span class="sourceLineNo">3252</span><a name="line.3252"></a>
<span class="sourceLineNo">3253</span>  /**<a name="line.3253"></a>
<span class="sourceLineNo">3254</span>   * Close asynchronously a region, can be called from the master or internally by the regionserver<a name="line.3254"></a>
<span class="sourceLineNo">3255</span>   * when stopping. If called from the master, the region will update the status.<a name="line.3255"></a>
<span class="sourceLineNo">3256</span>   *<a name="line.3256"></a>
<span class="sourceLineNo">3257</span>   * &lt;p&gt;<a name="line.3257"></a>
<span class="sourceLineNo">3258</span>   * If an opening was in progress, this method will cancel it, but will not start a new close. The<a name="line.3258"></a>
<span class="sourceLineNo">3259</span>   * coprocessors are not called in this case. A NotServingRegionException exception is thrown.<a name="line.3259"></a>
<span class="sourceLineNo">3260</span>   * &lt;/p&gt;<a name="line.3260"></a>
<span class="sourceLineNo">3261</span><a name="line.3261"></a>
<span class="sourceLineNo">3262</span>   * &lt;p&gt;<a name="line.3262"></a>
<span class="sourceLineNo">3263</span>   *   If a close was in progress, this new request will be ignored, and an exception thrown.<a name="line.3263"></a>
<span class="sourceLineNo">3264</span>   * &lt;/p&gt;<a name="line.3264"></a>
<span class="sourceLineNo">3265</span>   *<a name="line.3265"></a>
<span class="sourceLineNo">3266</span>   * @param encodedName Region to close<a name="line.3266"></a>
<span class="sourceLineNo">3267</span>   * @param abort True if we are aborting<a name="line.3267"></a>
<span class="sourceLineNo">3268</span>   * @param destination Where the Region is being moved too... maybe null if unknown.<a name="line.3268"></a>
<span class="sourceLineNo">3269</span>   * @return True if closed a region.<a name="line.3269"></a>
<span class="sourceLineNo">3270</span>   * @throws NotServingRegionException if the region is not online<a name="line.3270"></a>
<span class="sourceLineNo">3271</span>   */<a name="line.3271"></a>
<span class="sourceLineNo">3272</span>  protected boolean closeRegion(String encodedName, final boolean abort,<a name="line.3272"></a>
<span class="sourceLineNo">3273</span>        final ServerName destination)<a name="line.3273"></a>
<span class="sourceLineNo">3274</span>      throws NotServingRegionException {<a name="line.3274"></a>
<span class="sourceLineNo">3275</span>    //Check for permissions to close.<a name="line.3275"></a>
<span class="sourceLineNo">3276</span>    HRegion actualRegion = this.getRegion(encodedName);<a name="line.3276"></a>
<span class="sourceLineNo">3277</span>    // Can be null if we're calling close on a region that's not online<a name="line.3277"></a>
<span class="sourceLineNo">3278</span>    if ((actualRegion != null) &amp;&amp; (actualRegion.getCoprocessorHost() != null)) {<a name="line.3278"></a>
<span class="sourceLineNo">3279</span>      try {<a name="line.3279"></a>
<span class="sourceLineNo">3280</span>        actualRegion.getCoprocessorHost().preClose(false);<a name="line.3280"></a>
<span class="sourceLineNo">3281</span>      } catch (IOException exp) {<a name="line.3281"></a>
<span class="sourceLineNo">3282</span>        LOG.warn("Unable to close region: the coprocessor launched an error ", exp);<a name="line.3282"></a>
<span class="sourceLineNo">3283</span>        return false;<a name="line.3283"></a>
<span class="sourceLineNo">3284</span>      }<a name="line.3284"></a>
<span class="sourceLineNo">3285</span>    }<a name="line.3285"></a>
<span class="sourceLineNo">3286</span><a name="line.3286"></a>
<span class="sourceLineNo">3287</span>    // previous can come back 'null' if not in map.<a name="line.3287"></a>
<span class="sourceLineNo">3288</span>    final Boolean previous = this.regionsInTransitionInRS.putIfAbsent(Bytes.toBytes(encodedName),<a name="line.3288"></a>
<span class="sourceLineNo">3289</span>        Boolean.FALSE);<a name="line.3289"></a>
<span class="sourceLineNo">3290</span><a name="line.3290"></a>
<span class="sourceLineNo">3291</span>    if (Boolean.TRUE.equals(previous)) {<a name="line.3291"></a>
<span class="sourceLineNo">3292</span>      LOG.info("Received CLOSE for the region:" + encodedName + " , which we are already " +<a name="line.3292"></a>
<span class="sourceLineNo">3293</span>          "trying to OPEN. Cancelling OPENING.");<a name="line.3293"></a>
<span class="sourceLineNo">3294</span>      if (!regionsInTransitionInRS.replace(Bytes.toBytes(encodedName), previous, Boolean.FALSE)) {<a name="line.3294"></a>
<span class="sourceLineNo">3295</span>        // The replace failed. That should be an exceptional case, but theoretically it can happen.<a name="line.3295"></a>
<span class="sourceLineNo">3296</span>        // We're going to try to do a standard close then.<a name="line.3296"></a>
<span class="sourceLineNo">3297</span>        LOG.warn("The opening for region " + encodedName + " was done before we could cancel it." +<a name="line.3297"></a>
<span class="sourceLineNo">3298</span>            " Doing a standard close now");<a name="line.3298"></a>
<span class="sourceLineNo">3299</span>        return closeRegion(encodedName, abort, destination);<a name="line.3299"></a>
<span class="sourceLineNo">3300</span>      }<a name="line.3300"></a>
<span class="sourceLineNo">3301</span>      // Let's get the region from the online region list again<a name="line.3301"></a>
<span class="sourceLineNo">3302</span>      actualRegion = this.getRegion(encodedName);<a name="line.3302"></a>
<span class="sourceLineNo">3303</span>      if (actualRegion == null) { // If already online, we still need to close it.<a name="line.3303"></a>
<span class="sourceLineNo">3304</span>        LOG.info("The opening previously in progress has been cancelled by a CLOSE request.");<a name="line.3304"></a>
<span class="sourceLineNo">3305</span>        // The master deletes the znode when it receives this exception.<a name="line.3305"></a>
<span class="sourceLineNo">3306</span>        throw new NotServingRegionException("The region " + encodedName +<a name="line.3306"></a>
<span class="sourceLineNo">3307</span>          " was opening but not yet served. Opening is cancelled.");<a name="line.3307"></a>
<span class="sourceLineNo">3308</span>      }<a name="line.3308"></a>
<span class="sourceLineNo">3309</span>    } else if (previous == null) {<a name="line.3309"></a>
<span class="sourceLineNo">3310</span>      LOG.info("Received CLOSE for {}", encodedName);<a name="line.3310"></a>
<span class="sourceLineNo">3311</span>    } else if (Boolean.FALSE.equals(previous)) {<a name="line.3311"></a>
<span class="sourceLineNo">3312</span>      LOG.info("Received CLOSE for the region: " + encodedName +<a name="line.3312"></a>
<span class="sourceLineNo">3313</span>        ", which we are already trying to CLOSE, but not completed yet");<a name="line.3313"></a>
<span class="sourceLineNo">3314</span>      return true;<a name="line.3314"></a>
<span class="sourceLineNo">3315</span>    }<a name="line.3315"></a>
<span class="sourceLineNo">3316</span><a name="line.3316"></a>
<span class="sourceLineNo">3317</span>    if (actualRegion == null) {<a name="line.3317"></a>
<span class="sourceLineNo">3318</span>      LOG.debug("Received CLOSE for a region which is not online, and we're not opening.");<a name="line.3318"></a>
<span class="sourceLineNo">3319</span>      this.regionsInTransitionInRS.remove(Bytes.toBytes(encodedName));<a name="line.3319"></a>
<span class="sourceLineNo">3320</span>      // The master deletes the znode when it receives this exception.<a name="line.3320"></a>
<span class="sourceLineNo">3321</span>      throw new NotServingRegionException("The region " + encodedName +<a name="line.3321"></a>
<span class="sourceLineNo">3322</span>          " is not online, and is not opening.");<a name="line.3322"></a>
<span class="sourceLineNo">3323</span>    }<a name="line.3323"></a>
<span class="sourceLineNo">3324</span><a name="line.3324"></a>
<span class="sourceLineNo">3325</span>    CloseRegionHandler crh;<a name="line.3325"></a>
<span class="sourceLineNo">3326</span>    final RegionInfo hri = actualRegion.getRegionInfo();<a name="line.3326"></a>
<span class="sourceLineNo">3327</span>    if (hri.isMetaRegion()) {<a name="line.3327"></a>
<span class="sourceLineNo">3328</span>      crh = new CloseMetaHandler(this, this, hri, abort);<a name="line.3328"></a>
<span class="sourceLineNo">3329</span>    } else {<a name="line.3329"></a>
<span class="sourceLineNo">3330</span>      crh = new CloseRegionHandler(this, this, hri, abort, destination);<a name="line.3330"></a>
<span class="sourceLineNo">3331</span>    }<a name="line.3331"></a>
<span class="sourceLineNo">3332</span>    this.executorService.submit(crh);<a name="line.3332"></a>
<span class="sourceLineNo">3333</span>    return true;<a name="line.3333"></a>
<span class="sourceLineNo">3334</span>  }<a name="line.3334"></a>
<span class="sourceLineNo">3335</span><a name="line.3335"></a>
<span class="sourceLineNo">3336</span>   /**<a name="line.3336"></a>
<span class="sourceLineNo">3337</span>   * @return HRegion for the passed binary &lt;code&gt;regionName&lt;/code&gt; or null if<a name="line.3337"></a>
<span class="sourceLineNo">3338</span>   *         named region is not member of the online regions.<a name="line.3338"></a>
<span class="sourceLineNo">3339</span>   */<a name="line.3339"></a>
<span class="sourceLineNo">3340</span>  public HRegion getOnlineRegion(final byte[] regionName) {<a name="line.3340"></a>
<span class="sourceLineNo">3341</span>    String encodedRegionName = RegionInfo.encodeRegionName(regionName);<a name="line.3341"></a>
<span class="sourceLineNo">3342</span>    return this.onlineRegions.get(encodedRegionName);<a name="line.3342"></a>
<span class="sourceLineNo">3343</span>  }<a name="line.3343"></a>
<span class="sourceLineNo">3344</span><a name="line.3344"></a>
<span class="sourceLineNo">3345</span>  @Override<a name="line.3345"></a>
<span class="sourceLineNo">3346</span>  public HRegion getRegion(final String encodedRegionName) {<a name="line.3346"></a>
<span class="sourceLineNo">3347</span>    return this.onlineRegions.get(encodedRegionName);<a name="line.3347"></a>
<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
<span class="sourceLineNo">3349</span><a name="line.3349"></a>
<span class="sourceLineNo">3350</span><a name="line.3350"></a>
<span class="sourceLineNo">3351</span>  @Override<a name="line.3351"></a>
<span class="sourceLineNo">3352</span>  public boolean removeRegion(final HRegion r, ServerName destination) {<a name="line.3352"></a>
<span class="sourceLineNo">3353</span>    HRegion toReturn = this.onlineRegions.remove(r.getRegionInfo().getEncodedName());<a name="line.3353"></a>
<span class="sourceLineNo">3354</span>    metricsRegionServerImpl.requestsCountCache.remove(r.getRegionInfo().getEncodedName());<a name="line.3354"></a>
<span class="sourceLineNo">3355</span>    if (destination != null) {<a name="line.3355"></a>
<span class="sourceLineNo">3356</span>      long closeSeqNum = r.getMaxFlushedSeqId();<a name="line.3356"></a>
<span class="sourceLineNo">3357</span>      if (closeSeqNum == HConstants.NO_SEQNUM) {<a name="line.3357"></a>
<span class="sourceLineNo">3358</span>        // No edits in WAL for this region; get the sequence number when the region was opened.<a name="line.3358"></a>
<span class="sourceLineNo">3359</span>        closeSeqNum = r.getOpenSeqNum();<a name="line.3359"></a>
<span class="sourceLineNo">3360</span>        if (closeSeqNum == HConstants.NO_SEQNUM) closeSeqNum = 0;<a name="line.3360"></a>
<span class="sourceLineNo">3361</span>      }<a name="line.3361"></a>
<span class="sourceLineNo">3362</span>      boolean selfMove = ServerName.isSameAddress(destination, this.getServerName());<a name="line.3362"></a>
<span class="sourceLineNo">3363</span>      addToMovedRegions(r.getRegionInfo().getEncodedName(), destination, closeSeqNum, selfMove);<a name="line.3363"></a>
<span class="sourceLineNo">3364</span>      if (selfMove) {<a name="line.3364"></a>
<span class="sourceLineNo">3365</span>        this.regionServerAccounting.getRetainedRegionRWRequestsCnt().put(r.getRegionInfo().getEncodedName()<a name="line.3365"></a>
<span class="sourceLineNo">3366</span>          , new Pair&lt;&gt;(r.getReadRequestsCount(), r.getWriteRequestsCount()));<a name="line.3366"></a>
<span class="sourceLineNo">3367</span>      }<a name="line.3367"></a>
<span class="sourceLineNo">3368</span>    }<a name="line.3368"></a>
<span class="sourceLineNo">3369</span>    this.regionFavoredNodesMap.remove(r.getRegionInfo().getEncodedName());<a name="line.3369"></a>
<span class="sourceLineNo">3370</span>    configurationManager.deregisterObserver(r);<a name="line.3370"></a>
<span class="sourceLineNo">3371</span>    return toReturn != null;<a name="line.3371"></a>
<span class="sourceLineNo">3372</span>  }<a name="line.3372"></a>
<span class="sourceLineNo">3373</span><a name="line.3373"></a>
<span class="sourceLineNo">3374</span>  /**<a name="line.3374"></a>
<span class="sourceLineNo">3375</span>   * Protected Utility method for safely obtaining an HRegion handle.<a name="line.3375"></a>
<span class="sourceLineNo">3376</span>   *<a name="line.3376"></a>
<span class="sourceLineNo">3377</span>   * @param regionName Name of online {@link HRegion} to return<a name="line.3377"></a>
<span class="sourceLineNo">3378</span>   * @return {@link HRegion} for &lt;code&gt;regionName&lt;/code&gt;<a name="line.3378"></a>
<span class="sourceLineNo">3379</span>   */<a name="line.3379"></a>
<span class="sourceLineNo">3380</span>  protected HRegion getRegion(final byte[] regionName)<a name="line.3380"></a>
<span class="sourceLineNo">3381</span>      throws NotServingRegionException {<a name="line.3381"></a>
<span class="sourceLineNo">3382</span>    String encodedRegionName = RegionInfo.encodeRegionName(regionName);<a name="line.3382"></a>
<span class="sourceLineNo">3383</span>    return getRegionByEncodedName(regionName, encodedRegionName);<a name="line.3383"></a>
<span class="sourceLineNo">3384</span>  }<a name="line.3384"></a>
<span class="sourceLineNo">3385</span><a name="line.3385"></a>
<span class="sourceLineNo">3386</span>  public HRegion getRegionByEncodedName(String encodedRegionName)<a name="line.3386"></a>
<span class="sourceLineNo">3387</span>      throws NotServingRegionException {<a name="line.3387"></a>
<span class="sourceLineNo">3388</span>    return getRegionByEncodedName(null, encodedRegionName);<a name="line.3388"></a>
<span class="sourceLineNo">3389</span>  }<a name="line.3389"></a>
<span class="sourceLineNo">3390</span><a name="line.3390"></a>
<span class="sourceLineNo">3391</span>  private HRegion getRegionByEncodedName(byte[] regionName, String encodedRegionName)<a name="line.3391"></a>
<span class="sourceLineNo">3392</span>    throws NotServingRegionException {<a name="line.3392"></a>
<span class="sourceLineNo">3393</span>    HRegion region = this.onlineRegions.get(encodedRegionName);<a name="line.3393"></a>
<span class="sourceLineNo">3394</span>    if (region == null) {<a name="line.3394"></a>
<span class="sourceLineNo">3395</span>      MovedRegionInfo moveInfo = getMovedRegion(encodedRegionName);<a name="line.3395"></a>
<span class="sourceLineNo">3396</span>      if (moveInfo != null) {<a name="line.3396"></a>
<span class="sourceLineNo">3397</span>        throw new RegionMovedException(moveInfo.getServerName(), moveInfo.getSeqNum());<a name="line.3397"></a>
<span class="sourceLineNo">3398</span>      }<a name="line.3398"></a>
<span class="sourceLineNo">3399</span>      Boolean isOpening = this.regionsInTransitionInRS.get(Bytes.toBytes(encodedRegionName));<a name="line.3399"></a>
<span class="sourceLineNo">3400</span>      String regionNameStr = regionName == null?<a name="line.3400"></a>
<span class="sourceLineNo">3401</span>        encodedRegionName: Bytes.toStringBinary(regionName);<a name="line.3401"></a>
<span class="sourceLineNo">3402</span>      if (isOpening != null &amp;&amp; isOpening) {<a name="line.3402"></a>
<span class="sourceLineNo">3403</span>        throw new RegionOpeningException("Region " + regionNameStr +<a name="line.3403"></a>
<span class="sourceLineNo">3404</span>          " is opening on " + this.serverName);<a name="line.3404"></a>
<span class="sourceLineNo">3405</span>      }<a name="line.3405"></a>
<span class="sourceLineNo">3406</span>      throw new NotServingRegionException("" + regionNameStr +<a name="line.3406"></a>
<span class="sourceLineNo">3407</span>        " is not online on " + this.serverName);<a name="line.3407"></a>
<span class="sourceLineNo">3408</span>    }<a name="line.3408"></a>
<span class="sourceLineNo">3409</span>    return region;<a name="line.3409"></a>
<span class="sourceLineNo">3410</span>  }<a name="line.3410"></a>
<span class="sourceLineNo">3411</span><a name="line.3411"></a>
<span class="sourceLineNo">3412</span>  /**<a name="line.3412"></a>
<span class="sourceLineNo">3413</span>   * Cleanup after Throwable caught invoking method. Converts &lt;code&gt;t&lt;/code&gt; to<a name="line.3413"></a>
<span class="sourceLineNo">3414</span>   * IOE if it isn't already.<a name="line.3414"></a>
<span class="sourceLineNo">3415</span>   *<a name="line.3415"></a>
<span class="sourceLineNo">3416</span>   * @param t Throwable<a name="line.3416"></a>
<span class="sourceLineNo">3417</span>   * @param msg Message to log in error. Can be null.<a name="line.3417"></a>
<span class="sourceLineNo">3418</span>   * @return Throwable converted to an IOE; methods can only let out IOEs.<a name="line.3418"></a>
<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
<span class="sourceLineNo">3420</span>  private Throwable cleanup(final Throwable t, final String msg) {<a name="line.3420"></a>
<span class="sourceLineNo">3421</span>    // Don't log as error if NSRE; NSRE is 'normal' operation.<a name="line.3421"></a>
<span class="sourceLineNo">3422</span>    if (t instanceof NotServingRegionException) {<a name="line.3422"></a>
<span class="sourceLineNo">3423</span>      LOG.debug("NotServingRegionException; " + t.getMessage());<a name="line.3423"></a>
<span class="sourceLineNo">3424</span>      return t;<a name="line.3424"></a>
<span class="sourceLineNo">3425</span>    }<a name="line.3425"></a>
<span class="sourceLineNo">3426</span>    Throwable e = t instanceof RemoteException ? ((RemoteException) t).unwrapRemoteException() : t;<a name="line.3426"></a>
<span class="sourceLineNo">3427</span>    if (msg == null) {<a name="line.3427"></a>
<span class="sourceLineNo">3428</span>      LOG.error("", e);<a name="line.3428"></a>
<span class="sourceLineNo">3429</span>    } else {<a name="line.3429"></a>
<span class="sourceLineNo">3430</span>      LOG.error(msg, e);<a name="line.3430"></a>
<span class="sourceLineNo">3431</span>    }<a name="line.3431"></a>
<span class="sourceLineNo">3432</span>    if (!rpcServices.checkOOME(t)) {<a name="line.3432"></a>
<span class="sourceLineNo">3433</span>      checkFileSystem();<a name="line.3433"></a>
<span class="sourceLineNo">3434</span>    }<a name="line.3434"></a>
<span class="sourceLineNo">3435</span>    return t;<a name="line.3435"></a>
<span class="sourceLineNo">3436</span>  }<a name="line.3436"></a>
<span class="sourceLineNo">3437</span><a name="line.3437"></a>
<span class="sourceLineNo">3438</span>  /**<a name="line.3438"></a>
<span class="sourceLineNo">3439</span>   * @param msg Message to put in new IOE if passed &lt;code&gt;t&lt;/code&gt; is not an IOE<a name="line.3439"></a>
<span class="sourceLineNo">3440</span>   * @return Make &lt;code&gt;t&lt;/code&gt; an IOE if it isn't already.<a name="line.3440"></a>
<span class="sourceLineNo">3441</span>   */<a name="line.3441"></a>
<span class="sourceLineNo">3442</span>  private IOException convertThrowableToIOE(final Throwable t, final String msg) {<a name="line.3442"></a>
<span class="sourceLineNo">3443</span>    return (t instanceof IOException ? (IOException) t : msg == null<a name="line.3443"></a>
<span class="sourceLineNo">3444</span>        || msg.length() == 0 ? new IOException(t) : new IOException(msg, t));<a name="line.3444"></a>
<span class="sourceLineNo">3445</span>  }<a name="line.3445"></a>
<span class="sourceLineNo">3446</span><a name="line.3446"></a>
<span class="sourceLineNo">3447</span>  /**<a name="line.3447"></a>
<span class="sourceLineNo">3448</span>   * Checks to see if the file system is still accessible. If not, sets<a name="line.3448"></a>
<span class="sourceLineNo">3449</span>   * abortRequested and stopRequested<a name="line.3449"></a>
<span class="sourceLineNo">3450</span>   *<a name="line.3450"></a>
<span class="sourceLineNo">3451</span>   * @return false if file system is not available<a name="line.3451"></a>
<span class="sourceLineNo">3452</span>   */<a name="line.3452"></a>
<span class="sourceLineNo">3453</span>  boolean checkFileSystem() {<a name="line.3453"></a>
<span class="sourceLineNo">3454</span>    if (this.dataFsOk &amp;&amp; this.dataFs != null) {<a name="line.3454"></a>
<span class="sourceLineNo">3455</span>      try {<a name="line.3455"></a>
<span class="sourceLineNo">3456</span>        FSUtils.checkFileSystemAvailable(this.dataFs);<a name="line.3456"></a>
<span class="sourceLineNo">3457</span>      } catch (IOException e) {<a name="line.3457"></a>
<span class="sourceLineNo">3458</span>        abort("File System not available", e);<a name="line.3458"></a>
<span class="sourceLineNo">3459</span>        this.dataFsOk = false;<a name="line.3459"></a>
<span class="sourceLineNo">3460</span>      }<a name="line.3460"></a>
<span class="sourceLineNo">3461</span>    }<a name="line.3461"></a>
<span class="sourceLineNo">3462</span>    return this.dataFsOk;<a name="line.3462"></a>
<span class="sourceLineNo">3463</span>  }<a name="line.3463"></a>
<span class="sourceLineNo">3464</span><a name="line.3464"></a>
<span class="sourceLineNo">3465</span>  @Override<a name="line.3465"></a>
<span class="sourceLineNo">3466</span>  public void updateRegionFavoredNodesMapping(String encodedRegionName,<a name="line.3466"></a>
<span class="sourceLineNo">3467</span>      List&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName&gt; favoredNodes) {<a name="line.3467"></a>
<span class="sourceLineNo">3468</span>    InetSocketAddress[] addr = new InetSocketAddress[favoredNodes.size()];<a name="line.3468"></a>
<span class="sourceLineNo">3469</span>    // Refer to the comment on the declaration of regionFavoredNodesMap on why<a name="line.3469"></a>
<span class="sourceLineNo">3470</span>    // it is a map of region name to InetSocketAddress[]<a name="line.3470"></a>
<span class="sourceLineNo">3471</span>    for (int i = 0; i &lt; favoredNodes.size(); i++) {<a name="line.3471"></a>
<span class="sourceLineNo">3472</span>      addr[i] = InetSocketAddress.createUnresolved(favoredNodes.get(i).getHostName(),<a name="line.3472"></a>
<span class="sourceLineNo">3473</span>          favoredNodes.get(i).getPort());<a name="line.3473"></a>
<span class="sourceLineNo">3474</span>    }<a name="line.3474"></a>
<span class="sourceLineNo">3475</span>    regionFavoredNodesMap.put(encodedRegionName, addr);<a name="line.3475"></a>
<span class="sourceLineNo">3476</span>  }<a name="line.3476"></a>
<span class="sourceLineNo">3477</span><a name="line.3477"></a>
<span class="sourceLineNo">3478</span>  /**<a name="line.3478"></a>
<span class="sourceLineNo">3479</span>   * Return the favored nodes for a region given its encoded name. Look at the<a name="line.3479"></a>
<span class="sourceLineNo">3480</span>   * comment around {@link #regionFavoredNodesMap} on why it is InetSocketAddress[]<a name="line.3480"></a>
<span class="sourceLineNo">3481</span>   *<a name="line.3481"></a>
<span class="sourceLineNo">3482</span>   * @return array of favored locations<a name="line.3482"></a>
<span class="sourceLineNo">3483</span>   */<a name="line.3483"></a>
<span class="sourceLineNo">3484</span>  @Override<a name="line.3484"></a>
<span class="sourceLineNo">3485</span>  public InetSocketAddress[] getFavoredNodesForRegion(String encodedRegionName) {<a name="line.3485"></a>
<span class="sourceLineNo">3486</span>    return regionFavoredNodesMap.get(encodedRegionName);<a name="line.3486"></a>
<span class="sourceLineNo">3487</span>  }<a name="line.3487"></a>
<span class="sourceLineNo">3488</span><a name="line.3488"></a>
<span class="sourceLineNo">3489</span>  @Override<a name="line.3489"></a>
<span class="sourceLineNo">3490</span>  public ServerNonceManager getNonceManager() {<a name="line.3490"></a>
<span class="sourceLineNo">3491</span>    return this.nonceManager;<a name="line.3491"></a>
<span class="sourceLineNo">3492</span>  }<a name="line.3492"></a>
<span class="sourceLineNo">3493</span><a name="line.3493"></a>
<span class="sourceLineNo">3494</span>  private static class MovedRegionInfo {<a name="line.3494"></a>
<span class="sourceLineNo">3495</span>    private final ServerName serverName;<a name="line.3495"></a>
<span class="sourceLineNo">3496</span>    private final long seqNum;<a name="line.3496"></a>
<span class="sourceLineNo">3497</span><a name="line.3497"></a>
<span class="sourceLineNo">3498</span>    MovedRegionInfo(ServerName serverName, long closeSeqNum) {<a name="line.3498"></a>
<span class="sourceLineNo">3499</span>      this.serverName = serverName;<a name="line.3499"></a>
<span class="sourceLineNo">3500</span>      this.seqNum = closeSeqNum;<a name="line.3500"></a>
<span class="sourceLineNo">3501</span>     }<a name="line.3501"></a>
<span class="sourceLineNo">3502</span><a name="line.3502"></a>
<span class="sourceLineNo">3503</span>    public ServerName getServerName() {<a name="line.3503"></a>
<span class="sourceLineNo">3504</span>      return serverName;<a name="line.3504"></a>
<span class="sourceLineNo">3505</span>    }<a name="line.3505"></a>
<span class="sourceLineNo">3506</span><a name="line.3506"></a>
<span class="sourceLineNo">3507</span>    public long getSeqNum() {<a name="line.3507"></a>
<span class="sourceLineNo">3508</span>      return seqNum;<a name="line.3508"></a>
<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
<span class="sourceLineNo">3511</span><a name="line.3511"></a>
<span class="sourceLineNo">3512</span>  /**<a name="line.3512"></a>
<span class="sourceLineNo">3513</span>   * We need a timeout. If not there is a risk of giving a wrong information: this would double<a name="line.3513"></a>
<span class="sourceLineNo">3514</span>   * the number of network calls instead of reducing them.<a name="line.3514"></a>
<span class="sourceLineNo">3515</span>   */<a name="line.3515"></a>
<span class="sourceLineNo">3516</span>  private static final int TIMEOUT_REGION_MOVED = (2 * 60 * 1000);<a name="line.3516"></a>
<span class="sourceLineNo">3517</span><a name="line.3517"></a>
<span class="sourceLineNo">3518</span>  private void addToMovedRegions(String encodedName, ServerName destination, long closeSeqNum, boolean selfMove) {<a name="line.3518"></a>
<span class="sourceLineNo">3519</span>    if (selfMove) {<a name="line.3519"></a>
<span class="sourceLineNo">3520</span>      LOG.warn("Not adding moved region record: " + encodedName + " to self.");<a name="line.3520"></a>
<span class="sourceLineNo">3521</span>      return;<a name="line.3521"></a>
<span class="sourceLineNo">3522</span>    }<a name="line.3522"></a>
<span class="sourceLineNo">3523</span>    LOG.info("Adding " + encodedName + " move to " + destination + " record at close sequenceid=" +<a name="line.3523"></a>
<span class="sourceLineNo">3524</span>        closeSeqNum);<a name="line.3524"></a>
<span class="sourceLineNo">3525</span>    movedRegionInfoCache.put(encodedName, new MovedRegionInfo(destination, closeSeqNum));<a name="line.3525"></a>
<span class="sourceLineNo">3526</span>  }<a name="line.3526"></a>
<span class="sourceLineNo">3527</span><a name="line.3527"></a>
<span class="sourceLineNo">3528</span>  void removeFromMovedRegions(String encodedName) {<a name="line.3528"></a>
<span class="sourceLineNo">3529</span>    movedRegionInfoCache.invalidate(encodedName);<a name="line.3529"></a>
<span class="sourceLineNo">3530</span>  }<a name="line.3530"></a>
<span class="sourceLineNo">3531</span><a name="line.3531"></a>
<span class="sourceLineNo">3532</span>  @VisibleForTesting<a name="line.3532"></a>
<span class="sourceLineNo">3533</span>  public MovedRegionInfo getMovedRegion(String encodedRegionName) {<a name="line.3533"></a>
<span class="sourceLineNo">3534</span>    return movedRegionInfoCache.getIfPresent(encodedRegionName);<a name="line.3534"></a>
<span class="sourceLineNo">3535</span>  }<a name="line.3535"></a>
<span class="sourceLineNo">3536</span><a name="line.3536"></a>
<span class="sourceLineNo">3537</span>  @VisibleForTesting<a name="line.3537"></a>
<span class="sourceLineNo">3538</span>  public int movedRegionCacheExpiredTime() {<a name="line.3538"></a>
<span class="sourceLineNo">3539</span>        return TIMEOUT_REGION_MOVED;<a name="line.3539"></a>
<span class="sourceLineNo">3540</span>  }<a name="line.3540"></a>
<span class="sourceLineNo">3541</span><a name="line.3541"></a>
<span class="sourceLineNo">3542</span>  private String getMyEphemeralNodePath() {<a name="line.3542"></a>
<span class="sourceLineNo">3543</span>    return ZNodePaths.joinZNode(this.zooKeeper.getZNodePaths().rsZNode, getServerName().toString());<a name="line.3543"></a>
<span class="sourceLineNo">3544</span>  }<a name="line.3544"></a>
<span class="sourceLineNo">3545</span><a name="line.3545"></a>
<span class="sourceLineNo">3546</span>  private boolean isHealthCheckerConfigured() {<a name="line.3546"></a>
<span class="sourceLineNo">3547</span>    String healthScriptLocation = this.conf.get(HConstants.HEALTH_SCRIPT_LOC);<a name="line.3547"></a>
<span class="sourceLineNo">3548</span>    return org.apache.commons.lang3.StringUtils.isNotBlank(healthScriptLocation);<a name="line.3548"></a>
<span class="sourceLineNo">3549</span>  }<a name="line.3549"></a>
<span class="sourceLineNo">3550</span><a name="line.3550"></a>
<span class="sourceLineNo">3551</span>  /**<a name="line.3551"></a>
<span class="sourceLineNo">3552</span>   * @return the underlying {@link CompactSplit} for the servers<a name="line.3552"></a>
<span class="sourceLineNo">3553</span>   */<a name="line.3553"></a>
<span class="sourceLineNo">3554</span>  public CompactSplit getCompactSplitThread() {<a name="line.3554"></a>
<span class="sourceLineNo">3555</span>    return this.compactSplitThread;<a name="line.3555"></a>
<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
<span class="sourceLineNo">3557</span><a name="line.3557"></a>
<span class="sourceLineNo">3558</span>  CoprocessorServiceResponse execRegionServerService(<a name="line.3558"></a>
<span class="sourceLineNo">3559</span>      @SuppressWarnings("UnusedParameters") final RpcController controller,<a name="line.3559"></a>
<span class="sourceLineNo">3560</span>      final CoprocessorServiceRequest serviceRequest) throws ServiceException {<a name="line.3560"></a>
<span class="sourceLineNo">3561</span>    try {<a name="line.3561"></a>
<span class="sourceLineNo">3562</span>      ServerRpcController serviceController = new ServerRpcController();<a name="line.3562"></a>
<span class="sourceLineNo">3563</span>      CoprocessorServiceCall call = serviceRequest.getCall();<a name="line.3563"></a>
<span class="sourceLineNo">3564</span>      String serviceName = call.getServiceName();<a name="line.3564"></a>
<span class="sourceLineNo">3565</span>      Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.3565"></a>
<span class="sourceLineNo">3566</span>      if (service == null) {<a name="line.3566"></a>
<span class="sourceLineNo">3567</span>        throw new UnknownProtocolException(null, "No registered coprocessor executorService found for " +<a name="line.3567"></a>
<span class="sourceLineNo">3568</span>            serviceName);<a name="line.3568"></a>
<span class="sourceLineNo">3569</span>      }<a name="line.3569"></a>
<span class="sourceLineNo">3570</span>      ServiceDescriptor serviceDesc =<a name="line.3570"></a>
<span class="sourceLineNo">3571</span>          service.getDescriptorForType();<a name="line.3571"></a>
<span class="sourceLineNo">3572</span><a name="line.3572"></a>
<span class="sourceLineNo">3573</span>      String methodName = call.getMethodName();<a name="line.3573"></a>
<span class="sourceLineNo">3574</span>      MethodDescriptor methodDesc =<a name="line.3574"></a>
<span class="sourceLineNo">3575</span>          serviceDesc.findMethodByName(methodName);<a name="line.3575"></a>
<span class="sourceLineNo">3576</span>      if (methodDesc == null) {<a name="line.3576"></a>
<span class="sourceLineNo">3577</span>        throw new UnknownProtocolException(service.getClass(), "Unknown method " + methodName +<a name="line.3577"></a>
<span class="sourceLineNo">3578</span>            " called on executorService " + serviceName);<a name="line.3578"></a>
<span class="sourceLineNo">3579</span>      }<a name="line.3579"></a>
<span class="sourceLineNo">3580</span><a name="line.3580"></a>
<span class="sourceLineNo">3581</span>      Message request =<a name="line.3581"></a>
<span class="sourceLineNo">3582</span>          CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.3582"></a>
<span class="sourceLineNo">3583</span>      final Message.Builder responseBuilder =<a name="line.3583"></a>
<span class="sourceLineNo">3584</span>          service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.3584"></a>
<span class="sourceLineNo">3585</span>      service.callMethod(methodDesc, serviceController, request, message -&gt; {<a name="line.3585"></a>
<span class="sourceLineNo">3586</span>        if (message != null) {<a name="line.3586"></a>
<span class="sourceLineNo">3587</span>          responseBuilder.mergeFrom(message);<a name="line.3587"></a>
<span class="sourceLineNo">3588</span>        }<a name="line.3588"></a>
<span class="sourceLineNo">3589</span>      });<a name="line.3589"></a>
<span class="sourceLineNo">3590</span>      IOException exception = CoprocessorRpcUtils.getControllerException(serviceController);<a name="line.3590"></a>
<span class="sourceLineNo">3591</span>      if (exception != null) {<a name="line.3591"></a>
<span class="sourceLineNo">3592</span>        throw exception;<a name="line.3592"></a>
<span class="sourceLineNo">3593</span>      }<a name="line.3593"></a>
<span class="sourceLineNo">3594</span>      return CoprocessorRpcUtils.getResponse(responseBuilder.build(), HConstants.EMPTY_BYTE_ARRAY);<a name="line.3594"></a>
<span class="sourceLineNo">3595</span>    } catch (IOException ie) {<a name="line.3595"></a>
<span class="sourceLineNo">3596</span>      throw new ServiceException(ie);<a name="line.3596"></a>
<span class="sourceLineNo">3597</span>    }<a name="line.3597"></a>
<span class="sourceLineNo">3598</span>  }<a name="line.3598"></a>
<span class="sourceLineNo">3599</span><a name="line.3599"></a>
<span class="sourceLineNo">3600</span>  /**<a name="line.3600"></a>
<span class="sourceLineNo">3601</span>   * May be null if this is a master which not carry table.<a name="line.3601"></a>
<span class="sourceLineNo">3602</span>   *<a name="line.3602"></a>
<span class="sourceLineNo">3603</span>   * @return The block cache instance used by the regionserver.<a name="line.3603"></a>
<span class="sourceLineNo">3604</span>   */<a name="line.3604"></a>
<span class="sourceLineNo">3605</span>  @Override<a name="line.3605"></a>
<span class="sourceLineNo">3606</span>  public Optional&lt;BlockCache&gt; getBlockCache() {<a name="line.3606"></a>
<span class="sourceLineNo">3607</span>    return Optional.ofNullable(this.blockCache);<a name="line.3607"></a>
<span class="sourceLineNo">3608</span>  }<a name="line.3608"></a>
<span class="sourceLineNo">3609</span><a name="line.3609"></a>
<span class="sourceLineNo">3610</span>  /**<a name="line.3610"></a>
<span class="sourceLineNo">3611</span>   * May be null if this is a master which not carry table.<a name="line.3611"></a>
<span class="sourceLineNo">3612</span>   *<a name="line.3612"></a>
<span class="sourceLineNo">3613</span>   * @return The cache for mob files used by the regionserver.<a name="line.3613"></a>
<span class="sourceLineNo">3614</span>   */<a name="line.3614"></a>
<span class="sourceLineNo">3615</span>  @Override<a name="line.3615"></a>
<span class="sourceLineNo">3616</span>  public Optional&lt;MobFileCache&gt; getMobFileCache() {<a name="line.3616"></a>
<span class="sourceLineNo">3617</span>    return Optional.ofNullable(this.mobFileCache);<a name="line.3617"></a>
<span class="sourceLineNo">3618</span>  }<a name="line.3618"></a>
<span class="sourceLineNo">3619</span><a name="line.3619"></a>
<span class="sourceLineNo">3620</span>  @Override<a name="line.3620"></a>
<span class="sourceLineNo">3621</span>  public AccessChecker getAccessChecker() {<a name="line.3621"></a>
<span class="sourceLineNo">3622</span>    return rpcServices.getAccessChecker();<a name="line.3622"></a>
<span class="sourceLineNo">3623</span>  }<a name="line.3623"></a>
<span class="sourceLineNo">3624</span><a name="line.3624"></a>
<span class="sourceLineNo">3625</span>  @Override<a name="line.3625"></a>
<span class="sourceLineNo">3626</span>  public ZKPermissionWatcher getZKPermissionWatcher() {<a name="line.3626"></a>
<span class="sourceLineNo">3627</span>    return rpcServices.getZkPermissionWatcher();<a name="line.3627"></a>
<span class="sourceLineNo">3628</span>  }<a name="line.3628"></a>
<span class="sourceLineNo">3629</span><a name="line.3629"></a>
<span class="sourceLineNo">3630</span>  /**<a name="line.3630"></a>
<span class="sourceLineNo">3631</span>   * @return : Returns the ConfigurationManager object for testing purposes.<a name="line.3631"></a>
<span class="sourceLineNo">3632</span>   */<a name="line.3632"></a>
<span class="sourceLineNo">3633</span>  @VisibleForTesting<a name="line.3633"></a>
<span class="sourceLineNo">3634</span>  ConfigurationManager getConfigurationManager() {<a name="line.3634"></a>
<span class="sourceLineNo">3635</span>    return configurationManager;<a name="line.3635"></a>
<span class="sourceLineNo">3636</span>  }<a name="line.3636"></a>
<span class="sourceLineNo">3637</span><a name="line.3637"></a>
<span class="sourceLineNo">3638</span>  /**<a name="line.3638"></a>
<span class="sourceLineNo">3639</span>   * @return Return table descriptors implementation.<a name="line.3639"></a>
<span class="sourceLineNo">3640</span>   */<a name="line.3640"></a>
<span class="sourceLineNo">3641</span>  @Override<a name="line.3641"></a>
<span class="sourceLineNo">3642</span>  public TableDescriptors getTableDescriptors() {<a name="line.3642"></a>
<span class="sourceLineNo">3643</span>    return this.tableDescriptors;<a name="line.3643"></a>
<span class="sourceLineNo">3644</span>  }<a name="line.3644"></a>
<span class="sourceLineNo">3645</span><a name="line.3645"></a>
<span class="sourceLineNo">3646</span>  /**<a name="line.3646"></a>
<span class="sourceLineNo">3647</span>   * Reload the configuration from disk.<a name="line.3647"></a>
<span class="sourceLineNo">3648</span>   */<a name="line.3648"></a>
<span class="sourceLineNo">3649</span>  void updateConfiguration() {<a name="line.3649"></a>
<span class="sourceLineNo">3650</span>    LOG.info("Reloading the configuration from disk.");<a name="line.3650"></a>
<span class="sourceLineNo">3651</span>    // Reload the configuration from disk.<a name="line.3651"></a>
<span class="sourceLineNo">3652</span>    conf.reloadConfiguration();<a name="line.3652"></a>
<span class="sourceLineNo">3653</span>    configurationManager.notifyAllObservers(conf);<a name="line.3653"></a>
<span class="sourceLineNo">3654</span>  }<a name="line.3654"></a>
<span class="sourceLineNo">3655</span><a name="line.3655"></a>
<span class="sourceLineNo">3656</span>  CacheEvictionStats clearRegionBlockCache(Region region) {<a name="line.3656"></a>
<span class="sourceLineNo">3657</span>    long evictedBlocks = 0;<a name="line.3657"></a>
<span class="sourceLineNo">3658</span><a name="line.3658"></a>
<span class="sourceLineNo">3659</span>    for(Store store : region.getStores()) {<a name="line.3659"></a>
<span class="sourceLineNo">3660</span>      for(StoreFile hFile : store.getStorefiles()) {<a name="line.3660"></a>
<span class="sourceLineNo">3661</span>        evictedBlocks += blockCache.evictBlocksByHfileName(hFile.getPath().getName());<a name="line.3661"></a>
<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
<span class="sourceLineNo">3663</span>    }<a name="line.3663"></a>
<span class="sourceLineNo">3664</span><a name="line.3664"></a>
<span class="sourceLineNo">3665</span>    return CacheEvictionStats.builder()<a name="line.3665"></a>
<span class="sourceLineNo">3666</span>        .withEvictedBlocks(evictedBlocks)<a name="line.3666"></a>
<span class="sourceLineNo">3667</span>        .build();<a name="line.3667"></a>
<span class="sourceLineNo">3668</span>  }<a name="line.3668"></a>
<span class="sourceLineNo">3669</span><a name="line.3669"></a>
<span class="sourceLineNo">3670</span>  @Override<a name="line.3670"></a>
<span class="sourceLineNo">3671</span>  public double getCompactionPressure() {<a name="line.3671"></a>
<span class="sourceLineNo">3672</span>    double max = 0;<a name="line.3672"></a>
<span class="sourceLineNo">3673</span>    for (Region region : onlineRegions.values()) {<a name="line.3673"></a>
<span class="sourceLineNo">3674</span>      for (Store store : region.getStores()) {<a name="line.3674"></a>
<span class="sourceLineNo">3675</span>        double normCount = store.getCompactionPressure();<a name="line.3675"></a>
<span class="sourceLineNo">3676</span>        if (normCount &gt; max) {<a name="line.3676"></a>
<span class="sourceLineNo">3677</span>          max = normCount;<a name="line.3677"></a>
<span class="sourceLineNo">3678</span>        }<a name="line.3678"></a>
<span class="sourceLineNo">3679</span>      }<a name="line.3679"></a>
<span class="sourceLineNo">3680</span>    }<a name="line.3680"></a>
<span class="sourceLineNo">3681</span>    return max;<a name="line.3681"></a>
<span class="sourceLineNo">3682</span>  }<a name="line.3682"></a>
<span class="sourceLineNo">3683</span><a name="line.3683"></a>
<span class="sourceLineNo">3684</span>  @Override<a name="line.3684"></a>
<span class="sourceLineNo">3685</span>  public HeapMemoryManager getHeapMemoryManager() {<a name="line.3685"></a>
<span class="sourceLineNo">3686</span>    return hMemManager;<a name="line.3686"></a>
<span class="sourceLineNo">3687</span>  }<a name="line.3687"></a>
<span class="sourceLineNo">3688</span><a name="line.3688"></a>
<span class="sourceLineNo">3689</span>  MemStoreFlusher getMemStoreFlusher() {<a name="line.3689"></a>
<span class="sourceLineNo">3690</span>    return cacheFlusher;<a name="line.3690"></a>
<span class="sourceLineNo">3691</span>  }<a name="line.3691"></a>
<span class="sourceLineNo">3692</span><a name="line.3692"></a>
<span class="sourceLineNo">3693</span>  /**<a name="line.3693"></a>
<span class="sourceLineNo">3694</span>   * For testing<a name="line.3694"></a>
<span class="sourceLineNo">3695</span>   * @return whether all wal roll request finished for this regionserver<a name="line.3695"></a>
<span class="sourceLineNo">3696</span>   */<a name="line.3696"></a>
<span class="sourceLineNo">3697</span>  @VisibleForTesting<a name="line.3697"></a>
<span class="sourceLineNo">3698</span>  public boolean walRollRequestFinished() {<a name="line.3698"></a>
<span class="sourceLineNo">3699</span>    return this.walRoller.walRollFinished();<a name="line.3699"></a>
<span class="sourceLineNo">3700</span>  }<a name="line.3700"></a>
<span class="sourceLineNo">3701</span><a name="line.3701"></a>
<span class="sourceLineNo">3702</span>  @Override<a name="line.3702"></a>
<span class="sourceLineNo">3703</span>  public ThroughputController getFlushThroughputController() {<a name="line.3703"></a>
<span class="sourceLineNo">3704</span>    return flushThroughputController;<a name="line.3704"></a>
<span class="sourceLineNo">3705</span>  }<a name="line.3705"></a>
<span class="sourceLineNo">3706</span><a name="line.3706"></a>
<span class="sourceLineNo">3707</span>  @Override<a name="line.3707"></a>
<span class="sourceLineNo">3708</span>  public double getFlushPressure() {<a name="line.3708"></a>
<span class="sourceLineNo">3709</span>    if (getRegionServerAccounting() == null || cacheFlusher == null) {<a name="line.3709"></a>
<span class="sourceLineNo">3710</span>      // return 0 during RS initialization<a name="line.3710"></a>
<span class="sourceLineNo">3711</span>      return 0.0;<a name="line.3711"></a>
<span class="sourceLineNo">3712</span>    }<a name="line.3712"></a>
<span class="sourceLineNo">3713</span>    return getRegionServerAccounting().getFlushPressure();<a name="line.3713"></a>
<span class="sourceLineNo">3714</span>  }<a name="line.3714"></a>
<span class="sourceLineNo">3715</span><a name="line.3715"></a>
<span class="sourceLineNo">3716</span>  @Override<a name="line.3716"></a>
<span class="sourceLineNo">3717</span>  public void onConfigurationChange(Configuration newConf) {<a name="line.3717"></a>
<span class="sourceLineNo">3718</span>    ThroughputController old = this.flushThroughputController;<a name="line.3718"></a>
<span class="sourceLineNo">3719</span>    if (old != null) {<a name="line.3719"></a>
<span class="sourceLineNo">3720</span>      old.stop("configuration change");<a name="line.3720"></a>
<span class="sourceLineNo">3721</span>    }<a name="line.3721"></a>
<span class="sourceLineNo">3722</span>    this.flushThroughputController = FlushThroughputControllerFactory.create(this, newConf);<a name="line.3722"></a>
<span class="sourceLineNo">3723</span>    try {<a name="line.3723"></a>
<span class="sourceLineNo">3724</span>      Superusers.initialize(newConf);<a name="line.3724"></a>
<span class="sourceLineNo">3725</span>    } catch (IOException e) {<a name="line.3725"></a>
<span class="sourceLineNo">3726</span>      LOG.warn("Failed to initialize SuperUsers on reloading of the configuration");<a name="line.3726"></a>
<span class="sourceLineNo">3727</span>    }<a name="line.3727"></a>
<span class="sourceLineNo">3728</span>  }<a name="line.3728"></a>
<span class="sourceLineNo">3729</span><a name="line.3729"></a>
<span class="sourceLineNo">3730</span>  @Override<a name="line.3730"></a>
<span class="sourceLineNo">3731</span>  public MetricsRegionServer getMetrics() {<a name="line.3731"></a>
<span class="sourceLineNo">3732</span>    return metricsRegionServer;<a name="line.3732"></a>
<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
<span class="sourceLineNo">3734</span><a name="line.3734"></a>
<span class="sourceLineNo">3735</span>  @Override<a name="line.3735"></a>
<span class="sourceLineNo">3736</span>  public SecureBulkLoadManager getSecureBulkLoadManager() {<a name="line.3736"></a>
<span class="sourceLineNo">3737</span>    return this.secureBulkLoadManager;<a name="line.3737"></a>
<span class="sourceLineNo">3738</span>  }<a name="line.3738"></a>
<span class="sourceLineNo">3739</span><a name="line.3739"></a>
<span class="sourceLineNo">3740</span>  @Override<a name="line.3740"></a>
<span class="sourceLineNo">3741</span>  public EntityLock regionLock(final List&lt;RegionInfo&gt; regionInfo, final String description,<a name="line.3741"></a>
<span class="sourceLineNo">3742</span>      final Abortable abort) {<a name="line.3742"></a>
<span class="sourceLineNo">3743</span>    final LockServiceClient client =<a name="line.3743"></a>
<span class="sourceLineNo">3744</span>        new LockServiceClient(conf, lockStub, asyncClusterConnection.getNonceGenerator());<a name="line.3744"></a>
<span class="sourceLineNo">3745</span>    return client.regionLock(regionInfo, description, abort);<a name="line.3745"></a>
<span class="sourceLineNo">3746</span>  }<a name="line.3746"></a>
<span class="sourceLineNo">3747</span><a name="line.3747"></a>
<span class="sourceLineNo">3748</span>  @Override<a name="line.3748"></a>
<span class="sourceLineNo">3749</span>  public void unassign(byte[] regionName) throws IOException {<a name="line.3749"></a>
<span class="sourceLineNo">3750</span>    FutureUtils.get(asyncClusterConnection.getAdmin().unassign(regionName, false));<a name="line.3750"></a>
<span class="sourceLineNo">3751</span>  }<a name="line.3751"></a>
<span class="sourceLineNo">3752</span><a name="line.3752"></a>
<span class="sourceLineNo">3753</span>  @Override<a name="line.3753"></a>
<span class="sourceLineNo">3754</span>  public RegionServerSpaceQuotaManager getRegionServerSpaceQuotaManager() {<a name="line.3754"></a>
<span class="sourceLineNo">3755</span>    return this.rsSpaceQuotaManager;<a name="line.3755"></a>
<span class="sourceLineNo">3756</span>  }<a name="line.3756"></a>
<span class="sourceLineNo">3757</span><a name="line.3757"></a>
<span class="sourceLineNo">3758</span>  @Override<a name="line.3758"></a>
<span class="sourceLineNo">3759</span>  public boolean reportFileArchivalForQuotas(TableName tableName,<a name="line.3759"></a>
<span class="sourceLineNo">3760</span>      Collection&lt;Entry&lt;String, Long&gt;&gt; archivedFiles) {<a name="line.3760"></a>
<span class="sourceLineNo">3761</span>    RegionServerStatusService.BlockingInterface rss = rssStub;<a name="line.3761"></a>
<span class="sourceLineNo">3762</span>    if (rss == null || rsSpaceQuotaManager == null) {<a name="line.3762"></a>
<span class="sourceLineNo">3763</span>      // the current server could be stopping.<a name="line.3763"></a>
<span class="sourceLineNo">3764</span>      LOG.trace("Skipping file archival reporting to HMaster as stub is null");<a name="line.3764"></a>
<span class="sourceLineNo">3765</span>      return false;<a name="line.3765"></a>
<span class="sourceLineNo">3766</span>    }<a name="line.3766"></a>
<span class="sourceLineNo">3767</span>    try {<a name="line.3767"></a>
<span class="sourceLineNo">3768</span>      RegionServerStatusProtos.FileArchiveNotificationRequest request =<a name="line.3768"></a>
<span class="sourceLineNo">3769</span>          rsSpaceQuotaManager.buildFileArchiveRequest(tableName, archivedFiles);<a name="line.3769"></a>
<span class="sourceLineNo">3770</span>      rss.reportFileArchival(null, request);<a name="line.3770"></a>
<span class="sourceLineNo">3771</span>    } catch (ServiceException se) {<a name="line.3771"></a>
<span class="sourceLineNo">3772</span>      IOException ioe = ProtobufUtil.getRemoteException(se);<a name="line.3772"></a>
<span class="sourceLineNo">3773</span>      if (ioe instanceof PleaseHoldException) {<a name="line.3773"></a>
<span class="sourceLineNo">3774</span>        if (LOG.isTraceEnabled()) {<a name="line.3774"></a>
<span class="sourceLineNo">3775</span>          LOG.trace("Failed to report file archival(s) to Master because it is initializing."<a name="line.3775"></a>
<span class="sourceLineNo">3776</span>              + " This will be retried.", ioe);<a name="line.3776"></a>
<span class="sourceLineNo">3777</span>        }<a name="line.3777"></a>
<span class="sourceLineNo">3778</span>        // The Master is coming up. Will retry the report later. Avoid re-creating the stub.<a name="line.3778"></a>
<span class="sourceLineNo">3779</span>        return false;<a name="line.3779"></a>
<span class="sourceLineNo">3780</span>      }<a name="line.3780"></a>
<span class="sourceLineNo">3781</span>      if (rssStub == rss) {<a name="line.3781"></a>
<span class="sourceLineNo">3782</span>        rssStub = null;<a name="line.3782"></a>
<span class="sourceLineNo">3783</span>      }<a name="line.3783"></a>
<span class="sourceLineNo">3784</span>      // re-create the stub if we failed to report the archival<a name="line.3784"></a>
<span class="sourceLineNo">3785</span>      createRegionServerStatusStub(true);<a name="line.3785"></a>
<span class="sourceLineNo">3786</span>      LOG.debug("Failed to report file archival(s) to Master. This will be retried.", ioe);<a name="line.3786"></a>
<span class="sourceLineNo">3787</span>      return false;<a name="line.3787"></a>
<span class="sourceLineNo">3788</span>    }<a name="line.3788"></a>
<span class="sourceLineNo">3789</span>    return true;<a name="line.3789"></a>
<span class="sourceLineNo">3790</span>  }<a name="line.3790"></a>
<span class="sourceLineNo">3791</span><a name="line.3791"></a>
<span class="sourceLineNo">3792</span>  public NettyEventLoopGroupConfig getEventLoopGroupConfig() {<a name="line.3792"></a>
<span class="sourceLineNo">3793</span>    return eventLoopGroupConfig;<a name="line.3793"></a>
<span class="sourceLineNo">3794</span>  }<a name="line.3794"></a>
<span class="sourceLineNo">3795</span><a name="line.3795"></a>
<span class="sourceLineNo">3796</span>  @Override<a name="line.3796"></a>
<span class="sourceLineNo">3797</span>  public Connection createConnection(Configuration conf) throws IOException {<a name="line.3797"></a>
<span class="sourceLineNo">3798</span>    User user = UserProvider.instantiate(conf).getCurrent();<a name="line.3798"></a>
<span class="sourceLineNo">3799</span>    return ConnectionFactory.createConnection(conf, null, user);<a name="line.3799"></a>
<span class="sourceLineNo">3800</span>  }<a name="line.3800"></a>
<span class="sourceLineNo">3801</span><a name="line.3801"></a>
<span class="sourceLineNo">3802</span>  void executeProcedure(long procId, RSProcedureCallable callable) {<a name="line.3802"></a>
<span class="sourceLineNo">3803</span>    executorService.submit(new RSProcedureHandler(this, procId, callable));<a name="line.3803"></a>
<span class="sourceLineNo">3804</span>  }<a name="line.3804"></a>
<span class="sourceLineNo">3805</span><a name="line.3805"></a>
<span class="sourceLineNo">3806</span>  public void remoteProcedureComplete(long procId, Throwable error) {<a name="line.3806"></a>
<span class="sourceLineNo">3807</span>    procedureResultReporter.complete(procId, error);<a name="line.3807"></a>
<span class="sourceLineNo">3808</span>  }<a name="line.3808"></a>
<span class="sourceLineNo">3809</span><a name="line.3809"></a>
<span class="sourceLineNo">3810</span>  void reportProcedureDone(ReportProcedureDoneRequest request) throws IOException {<a name="line.3810"></a>
<span class="sourceLineNo">3811</span>    RegionServerStatusService.BlockingInterface rss;<a name="line.3811"></a>
<span class="sourceLineNo">3812</span>    // TODO: juggling class state with an instance variable, outside of a synchronized block :'(<a name="line.3812"></a>
<span class="sourceLineNo">3813</span>    for (;;) {<a name="line.3813"></a>
<span class="sourceLineNo">3814</span>      rss = rssStub;<a name="line.3814"></a>
<span class="sourceLineNo">3815</span>      if (rss != null) {<a name="line.3815"></a>
<span class="sourceLineNo">3816</span>        break;<a name="line.3816"></a>
<span class="sourceLineNo">3817</span>      }<a name="line.3817"></a>
<span class="sourceLineNo">3818</span>      createRegionServerStatusStub();<a name="line.3818"></a>
<span class="sourceLineNo">3819</span>    }<a name="line.3819"></a>
<span class="sourceLineNo">3820</span>    try {<a name="line.3820"></a>
<span class="sourceLineNo">3821</span>      rss.reportProcedureDone(null, request);<a name="line.3821"></a>
<span class="sourceLineNo">3822</span>    } catch (ServiceException se) {<a name="line.3822"></a>
<span class="sourceLineNo">3823</span>      if (rssStub == rss) {<a name="line.3823"></a>
<span class="sourceLineNo">3824</span>        rssStub = null;<a name="line.3824"></a>
<span class="sourceLineNo">3825</span>      }<a name="line.3825"></a>
<span class="sourceLineNo">3826</span>      throw ProtobufUtil.getRemoteException(se);<a name="line.3826"></a>
<span class="sourceLineNo">3827</span>    }<a name="line.3827"></a>
<span class="sourceLineNo">3828</span>  }<a name="line.3828"></a>
<span class="sourceLineNo">3829</span><a name="line.3829"></a>
<span class="sourceLineNo">3830</span>  /**<a name="line.3830"></a>
<span class="sourceLineNo">3831</span>   * Will ignore the open/close region procedures which already submitted or executed.<a name="line.3831"></a>
<span class="sourceLineNo">3832</span>   *<a name="line.3832"></a>
<span class="sourceLineNo">3833</span>   * When master had unfinished open/close region procedure and restarted, new active master may<a name="line.3833"></a>
<span class="sourceLineNo">3834</span>   * send duplicate open/close region request to regionserver. The open/close request is submitted<a name="line.3834"></a>
<span class="sourceLineNo">3835</span>   * to a thread pool and execute. So first need a cache for submitted open/close region procedures.<a name="line.3835"></a>
<span class="sourceLineNo">3836</span>   *<a name="line.3836"></a>
<span class="sourceLineNo">3837</span>   * After the open/close region request executed and report region transition succeed, cache it in<a name="line.3837"></a>
<span class="sourceLineNo">3838</span>   * executed region procedures cache. See {@link #finishRegionProcedure(long)}. After report region<a name="line.3838"></a>
<span class="sourceLineNo">3839</span>   * transition succeed, master will not send the open/close region request to regionserver again.<a name="line.3839"></a>
<span class="sourceLineNo">3840</span>   * And we thought that the ongoing duplicate open/close region request should not be delayed more<a name="line.3840"></a>
<span class="sourceLineNo">3841</span>   * than 600 seconds. So the executed region procedures cache will expire after 600 seconds.<a name="line.3841"></a>
<span class="sourceLineNo">3842</span>   *<a name="line.3842"></a>
<span class="sourceLineNo">3843</span>   * See HBASE-22404 for more details.<a name="line.3843"></a>
<span class="sourceLineNo">3844</span>   *<a name="line.3844"></a>
<span class="sourceLineNo">3845</span>   * @param procId the id of the open/close region procedure<a name="line.3845"></a>
<span class="sourceLineNo">3846</span>   * @return true if the procedure can be submitted.<a name="line.3846"></a>
<span class="sourceLineNo">3847</span>   */<a name="line.3847"></a>
<span class="sourceLineNo">3848</span>  boolean submitRegionProcedure(long procId) {<a name="line.3848"></a>
<span class="sourceLineNo">3849</span>    if (procId == -1) {<a name="line.3849"></a>
<span class="sourceLineNo">3850</span>      return true;<a name="line.3850"></a>
<span class="sourceLineNo">3851</span>    }<a name="line.3851"></a>
<span class="sourceLineNo">3852</span>    // Ignore the region procedures which already submitted.<a name="line.3852"></a>
<span class="sourceLineNo">3853</span>    Long previous = submittedRegionProcedures.putIfAbsent(procId, procId);<a name="line.3853"></a>
<span class="sourceLineNo">3854</span>    if (previous != null) {<a name="line.3854"></a>
<span class="sourceLineNo">3855</span>      LOG.warn("Received procedure pid={}, which already submitted, just ignore it", procId);<a name="line.3855"></a>
<span class="sourceLineNo">3856</span>      return false;<a name="line.3856"></a>
<span class="sourceLineNo">3857</span>    }<a name="line.3857"></a>
<span class="sourceLineNo">3858</span>    // Ignore the region procedures which already executed.<a name="line.3858"></a>
<span class="sourceLineNo">3859</span>    if (executedRegionProcedures.getIfPresent(procId) != null) {<a name="line.3859"></a>
<span class="sourceLineNo">3860</span>      LOG.warn("Received procedure pid={}, which already executed, just ignore it", procId);<a name="line.3860"></a>
<span class="sourceLineNo">3861</span>      return false;<a name="line.3861"></a>
<span class="sourceLineNo">3862</span>    }<a name="line.3862"></a>
<span class="sourceLineNo">3863</span>    return true;<a name="line.3863"></a>
<span class="sourceLineNo">3864</span>  }<a name="line.3864"></a>
<span class="sourceLineNo">3865</span><a name="line.3865"></a>
<span class="sourceLineNo">3866</span>  /**<a name="line.3866"></a>
<span class="sourceLineNo">3867</span>   * See {@link #submitRegionProcedure(long)}.<a name="line.3867"></a>
<span class="sourceLineNo">3868</span>   * @param procId the id of the open/close region procedure<a name="line.3868"></a>
<span class="sourceLineNo">3869</span>   */<a name="line.3869"></a>
<span class="sourceLineNo">3870</span>  public void finishRegionProcedure(long procId) {<a name="line.3870"></a>
<span class="sourceLineNo">3871</span>    executedRegionProcedures.put(procId, procId);<a name="line.3871"></a>
<span class="sourceLineNo">3872</span>    submittedRegionProcedures.remove(procId);<a name="line.3872"></a>
<span class="sourceLineNo">3873</span>  }<a name="line.3873"></a>
<span class="sourceLineNo">3874</span><a name="line.3874"></a>
<span class="sourceLineNo">3875</span>  public boolean isShutDown() {<a name="line.3875"></a>
<span class="sourceLineNo">3876</span>    return shutDown;<a name="line.3876"></a>
<span class="sourceLineNo">3877</span>  }<a name="line.3877"></a>
<span class="sourceLineNo">3878</span><a name="line.3878"></a>
<span class="sourceLineNo">3879</span>  /**<a name="line.3879"></a>
<span class="sourceLineNo">3880</span>   * Force to terminate region server when abort timeout.<a name="line.3880"></a>
<span class="sourceLineNo">3881</span>   */<a name="line.3881"></a>
<span class="sourceLineNo">3882</span>  private static class SystemExitWhenAbortTimeout extends TimerTask {<a name="line.3882"></a>
<span class="sourceLineNo">3883</span><a name="line.3883"></a>
<span class="sourceLineNo">3884</span>    public SystemExitWhenAbortTimeout() {<a name="line.3884"></a>
<span class="sourceLineNo">3885</span>    }<a name="line.3885"></a>
<span class="sourceLineNo">3886</span><a name="line.3886"></a>
<span class="sourceLineNo">3887</span>    @Override<a name="line.3887"></a>
<span class="sourceLineNo">3888</span>    public void run() {<a name="line.3888"></a>
<span class="sourceLineNo">3889</span>      LOG.warn("Aborting region server timed out, terminating forcibly" +<a name="line.3889"></a>
<span class="sourceLineNo">3890</span>          " and does not wait for any running shutdown hooks or finalizers to finish their work." +<a name="line.3890"></a>
<span class="sourceLineNo">3891</span>          " Thread dump to stdout.");<a name="line.3891"></a>
<span class="sourceLineNo">3892</span>      Threads.printThreadInfo(System.out, "Zombie HRegionServer");<a name="line.3892"></a>
<span class="sourceLineNo">3893</span>      Runtime.getRuntime().halt(1);<a name="line.3893"></a>
<span class="sourceLineNo">3894</span>    }<a name="line.3894"></a>
<span class="sourceLineNo">3895</span>  }<a name="line.3895"></a>
<span class="sourceLineNo">3896</span><a name="line.3896"></a>
<span class="sourceLineNo">3897</span>  @Override<a name="line.3897"></a>
<span class="sourceLineNo">3898</span>  public AsyncClusterConnection getAsyncClusterConnection() {<a name="line.3898"></a>
<span class="sourceLineNo">3899</span>    return asyncClusterConnection;<a name="line.3899"></a>
<span class="sourceLineNo">3900</span>  }<a name="line.3900"></a>
<span class="sourceLineNo">3901</span><a name="line.3901"></a>
<span class="sourceLineNo">3902</span>  @VisibleForTesting<a name="line.3902"></a>
<span class="sourceLineNo">3903</span>  public CompactedHFilesDischarger getCompactedHFilesDischarger() {<a name="line.3903"></a>
<span class="sourceLineNo">3904</span>    return compactedFileDischarger;<a name="line.3904"></a>
<span class="sourceLineNo">3905</span>  }<a name="line.3905"></a>
<span class="sourceLineNo">3906</span>}<a name="line.3906"></a>




























































</pre>
</div>
</body>
</html>
