<!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.client;<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.MASTER_ADDRS_KEY;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.util.DNS.getHostname;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import static org.apache.hadoop.hbase.util.FutureUtils.addListener;<a name="line.22"></a>
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.net.UnknownHostException;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.ArrayList;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.Collections;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.HashSet;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.Set;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.concurrent.CompletableFuture;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentLinkedQueue;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.util.concurrent.ThreadLocalRandom;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.function.Predicate;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.stream.Collectors;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.hadoop.conf.Configuration;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HConstants;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.ServerName;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.exceptions.MasterRegistryFetchException;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.ipc.RpcClient;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.ipc.RpcClientFactory;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.DNS.ServerType;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.50"></a>
<span class="sourceLineNo">051</span><a name="line.51"></a>
<span class="sourceLineNo">052</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import org.apache.hbase.thirdparty.com.google.common.base.Strings;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableMap;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hbase.thirdparty.com.google.common.net.HostAndPort;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.protobuf.Message;<a name="line.57"></a>
<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.protobuf.RpcCallback;<a name="line.58"></a>
<span class="sourceLineNo">059</span><a name="line.59"></a>
<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.60"></a>
<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClientMetaService;<a name="line.61"></a>
<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdRequest;<a name="line.62"></a>
<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdResponse;<a name="line.63"></a>
<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMastersRequest;<a name="line.64"></a>
<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMastersResponse;<a name="line.65"></a>
<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMastersResponseEntry;<a name="line.66"></a>
<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsRequest;<a name="line.67"></a>
<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsResponse;<a name="line.68"></a>
<span class="sourceLineNo">069</span><a name="line.69"></a>
<span class="sourceLineNo">070</span>/**<a name="line.70"></a>
<span class="sourceLineNo">071</span> * Master based registry implementation. Makes RPCs to the configured master addresses from config<a name="line.71"></a>
<span class="sourceLineNo">072</span> * {@value org.apache.hadoop.hbase.HConstants#MASTER_ADDRS_KEY}.<a name="line.72"></a>
<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
<span class="sourceLineNo">074</span> * It supports hedged reads, set the fan out of the requests batch by<a name="line.74"></a>
<span class="sourceLineNo">075</span> * {@link #MASTER_REGISTRY_HEDGED_REQS_FANOUT_KEY} to a value greater than {@code 1} will enable<a name="line.75"></a>
<span class="sourceLineNo">076</span> * it(the default value is {@link #MASTER_REGISTRY_HEDGED_REQS_FANOUT_DEFAULT}).<a name="line.76"></a>
<span class="sourceLineNo">077</span> * &lt;p/&gt;<a name="line.77"></a>
<span class="sourceLineNo">078</span> * TODO: Handle changes to the configuration dynamically without having to restart the client.<a name="line.78"></a>
<span class="sourceLineNo">079</span> */<a name="line.79"></a>
<span class="sourceLineNo">080</span>@InterfaceAudience.Private<a name="line.80"></a>
<span class="sourceLineNo">081</span>public class MasterRegistry implements ConnectionRegistry {<a name="line.81"></a>
<span class="sourceLineNo">082</span><a name="line.82"></a>
<span class="sourceLineNo">083</span>  /** Configuration key that controls the fan out of requests **/<a name="line.83"></a>
<span class="sourceLineNo">084</span>  public static final String MASTER_REGISTRY_HEDGED_REQS_FANOUT_KEY =<a name="line.84"></a>
<span class="sourceLineNo">085</span>    "hbase.client.master_registry.hedged.fanout";<a name="line.85"></a>
<span class="sourceLineNo">086</span><a name="line.86"></a>
<span class="sourceLineNo">087</span>  /** Default value for the fan out of hedged requests. **/<a name="line.87"></a>
<span class="sourceLineNo">088</span>  public static final int MASTER_REGISTRY_HEDGED_REQS_FANOUT_DEFAULT = 2;<a name="line.88"></a>
<span class="sourceLineNo">089</span><a name="line.89"></a>
<span class="sourceLineNo">090</span>  private static final String MASTER_ADDRS_CONF_SEPARATOR = ",";<a name="line.90"></a>
<span class="sourceLineNo">091</span><a name="line.91"></a>
<span class="sourceLineNo">092</span>  private final int hedgedReadFanOut;<a name="line.92"></a>
<span class="sourceLineNo">093</span><a name="line.93"></a>
<span class="sourceLineNo">094</span>  // Configured list of masters to probe the meta information from.<a name="line.94"></a>
<span class="sourceLineNo">095</span>  private volatile ImmutableMap&lt;ServerName, ClientMetaService.Interface&gt; masterAddr2Stub;<a name="line.95"></a>
<span class="sourceLineNo">096</span><a name="line.96"></a>
<span class="sourceLineNo">097</span>  // RPC client used to talk to the masters.<a name="line.97"></a>
<span class="sourceLineNo">098</span>  private final RpcClient rpcClient;<a name="line.98"></a>
<span class="sourceLineNo">099</span>  private final RpcControllerFactory rpcControllerFactory;<a name="line.99"></a>
<span class="sourceLineNo">100</span>  private final int rpcTimeoutMs;<a name="line.100"></a>
<span class="sourceLineNo">101</span><a name="line.101"></a>
<span class="sourceLineNo">102</span>  protected final MasterAddressRefresher masterAddressRefresher;<a name="line.102"></a>
<span class="sourceLineNo">103</span><a name="line.103"></a>
<span class="sourceLineNo">104</span>  /**<a name="line.104"></a>
<span class="sourceLineNo">105</span>   * Parses the list of master addresses from the provided configuration. Supported format is comma<a name="line.105"></a>
<span class="sourceLineNo">106</span>   * separated host[:port] values. If no port number if specified, default master port is assumed.<a name="line.106"></a>
<span class="sourceLineNo">107</span>   * @param conf Configuration to parse from.<a name="line.107"></a>
<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
<span class="sourceLineNo">109</span>  private static Set&lt;ServerName&gt; parseMasterAddrs(Configuration conf) throws UnknownHostException {<a name="line.109"></a>
<span class="sourceLineNo">110</span>    Set&lt;ServerName&gt; masterAddrs = new HashSet&lt;&gt;();<a name="line.110"></a>
<span class="sourceLineNo">111</span>    String configuredMasters = getMasterAddr(conf);<a name="line.111"></a>
<span class="sourceLineNo">112</span>    for (String masterAddr : configuredMasters.split(MASTER_ADDRS_CONF_SEPARATOR)) {<a name="line.112"></a>
<span class="sourceLineNo">113</span>      HostAndPort masterHostPort =<a name="line.113"></a>
<span class="sourceLineNo">114</span>        HostAndPort.fromString(masterAddr.trim()).withDefaultPort(HConstants.DEFAULT_MASTER_PORT);<a name="line.114"></a>
<span class="sourceLineNo">115</span>      masterAddrs.add(ServerName.valueOf(masterHostPort.toString(), ServerName.NON_STARTCODE));<a name="line.115"></a>
<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
<span class="sourceLineNo">117</span>    Preconditions.checkArgument(!masterAddrs.isEmpty(), "At least one master address is needed");<a name="line.117"></a>
<span class="sourceLineNo">118</span>    return masterAddrs;<a name="line.118"></a>
<span class="sourceLineNo">119</span>  }<a name="line.119"></a>
<span class="sourceLineNo">120</span><a name="line.120"></a>
<span class="sourceLineNo">121</span>  MasterRegistry(Configuration conf) throws IOException {<a name="line.121"></a>
<span class="sourceLineNo">122</span>    this.hedgedReadFanOut = Math.max(1, conf.getInt(MASTER_REGISTRY_HEDGED_REQS_FANOUT_KEY,<a name="line.122"></a>
<span class="sourceLineNo">123</span>      MASTER_REGISTRY_HEDGED_REQS_FANOUT_DEFAULT));<a name="line.123"></a>
<span class="sourceLineNo">124</span>    rpcTimeoutMs = (int) Math.min(Integer.MAX_VALUE,<a name="line.124"></a>
<span class="sourceLineNo">125</span>      conf.getLong(HConstants.HBASE_RPC_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT));<a name="line.125"></a>
<span class="sourceLineNo">126</span>    // XXX: we pass cluster id as null here since we do not have a cluster id yet, we have to fetch<a name="line.126"></a>
<span class="sourceLineNo">127</span>    // this through the master registry...<a name="line.127"></a>
<span class="sourceLineNo">128</span>    // This is a problem as we will use the cluster id to determine the authentication method<a name="line.128"></a>
<span class="sourceLineNo">129</span>    rpcClient = RpcClientFactory.createClient(conf, null);<a name="line.129"></a>
<span class="sourceLineNo">130</span>    rpcControllerFactory = RpcControllerFactory.instantiate(conf);<a name="line.130"></a>
<span class="sourceLineNo">131</span>    // Generate the seed list of master stubs. Subsequent RPCs try to keep a live list of masters<a name="line.131"></a>
<span class="sourceLineNo">132</span>    // by fetching the end points from this list.<a name="line.132"></a>
<span class="sourceLineNo">133</span>    populateMasterStubs(parseMasterAddrs(conf));<a name="line.133"></a>
<span class="sourceLineNo">134</span>    masterAddressRefresher = new MasterAddressRefresher(conf, this);<a name="line.134"></a>
<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>  void populateMasterStubs(Set&lt;ServerName&gt; masters) throws IOException {<a name="line.137"></a>
<span class="sourceLineNo">138</span>    Preconditions.checkNotNull(masters);<a name="line.138"></a>
<span class="sourceLineNo">139</span>    ImmutableMap.Builder&lt;ServerName, ClientMetaService.Interface&gt; builder =<a name="line.139"></a>
<span class="sourceLineNo">140</span>        ImmutableMap.builderWithExpectedSize(masters.size());<a name="line.140"></a>
<span class="sourceLineNo">141</span>    User user = User.getCurrent();<a name="line.141"></a>
<span class="sourceLineNo">142</span>    for (ServerName masterAddr : masters) {<a name="line.142"></a>
<span class="sourceLineNo">143</span>      builder.put(masterAddr,<a name="line.143"></a>
<span class="sourceLineNo">144</span>          ClientMetaService.newStub(rpcClient.createRpcChannel(masterAddr, user, rpcTimeoutMs)));<a name="line.144"></a>
<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
<span class="sourceLineNo">146</span>    masterAddr2Stub = builder.build();<a name="line.146"></a>
<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
<span class="sourceLineNo">148</span><a name="line.148"></a>
<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
<span class="sourceLineNo">150</span>   * Builds the default master address end point if it is not specified in the configuration.<a name="line.150"></a>
<span class="sourceLineNo">151</span>   * &lt;p/&gt;<a name="line.151"></a>
<span class="sourceLineNo">152</span>   * Will be called in {@code HBaseTestingUtility}.<a name="line.152"></a>
<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
<span class="sourceLineNo">154</span>  @VisibleForTesting<a name="line.154"></a>
<span class="sourceLineNo">155</span>  public static String getMasterAddr(Configuration conf) throws UnknownHostException {<a name="line.155"></a>
<span class="sourceLineNo">156</span>    String masterAddrFromConf = conf.get(MASTER_ADDRS_KEY);<a name="line.156"></a>
<span class="sourceLineNo">157</span>    if (!Strings.isNullOrEmpty(masterAddrFromConf)) {<a name="line.157"></a>
<span class="sourceLineNo">158</span>      return masterAddrFromConf;<a name="line.158"></a>
<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
<span class="sourceLineNo">160</span>    String hostname = getHostname(conf, ServerType.MASTER);<a name="line.160"></a>
<span class="sourceLineNo">161</span>    int port = conf.getInt(HConstants.MASTER_PORT, HConstants.DEFAULT_MASTER_PORT);<a name="line.161"></a>
<span class="sourceLineNo">162</span>    return String.format("%s:%d", hostname, port);<a name="line.162"></a>
<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
<span class="sourceLineNo">166</span>   * For describing the actual asynchronous rpc call.<a name="line.166"></a>
<span class="sourceLineNo">167</span>   * &lt;p/&gt;<a name="line.167"></a>
<span class="sourceLineNo">168</span>   * Typically, you can use lambda expression to implement this interface as<a name="line.168"></a>
<span class="sourceLineNo">169</span>   *<a name="line.169"></a>
<span class="sourceLineNo">170</span>   * &lt;pre&gt;<a name="line.170"></a>
<span class="sourceLineNo">171</span>   * (c, s, d) -&gt; s.xxx(c, your request here, d)<a name="line.171"></a>
<span class="sourceLineNo">172</span>   * &lt;/pre&gt;<a name="line.172"></a>
<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
<span class="sourceLineNo">174</span>  @FunctionalInterface<a name="line.174"></a>
<span class="sourceLineNo">175</span>  private interface Callable&lt;T&gt; {<a name="line.175"></a>
<span class="sourceLineNo">176</span>    void call(HBaseRpcController controller, ClientMetaService.Interface stub, RpcCallback&lt;T&gt; done);<a name="line.176"></a>
<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
<span class="sourceLineNo">178</span><a name="line.178"></a>
<span class="sourceLineNo">179</span>  private &lt;T extends Message&gt; CompletableFuture&lt;T&gt; call(ClientMetaService.Interface stub,<a name="line.179"></a>
<span class="sourceLineNo">180</span>    Callable&lt;T&gt; callable) {<a name="line.180"></a>
<span class="sourceLineNo">181</span>    HBaseRpcController controller = rpcControllerFactory.newController();<a name="line.181"></a>
<span class="sourceLineNo">182</span>    CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();<a name="line.182"></a>
<span class="sourceLineNo">183</span>    callable.call(controller, stub, resp -&gt; {<a name="line.183"></a>
<span class="sourceLineNo">184</span>      if (controller.failed()) {<a name="line.184"></a>
<span class="sourceLineNo">185</span>        IOException failureReason = controller.getFailed();<a name="line.185"></a>
<span class="sourceLineNo">186</span>        future.completeExceptionally(failureReason);<a name="line.186"></a>
<span class="sourceLineNo">187</span>        if (ClientExceptionsUtil.isConnectionException(failureReason)) {<a name="line.187"></a>
<span class="sourceLineNo">188</span>          // RPC has failed, trigger a refresh of master end points. We can have some spurious<a name="line.188"></a>
<span class="sourceLineNo">189</span>          // refreshes, but that is okay since the RPC is not expensive and not in a hot path.<a name="line.189"></a>
<span class="sourceLineNo">190</span>          masterAddressRefresher.refreshNow();<a name="line.190"></a>
<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
<span class="sourceLineNo">192</span>      } else {<a name="line.192"></a>
<span class="sourceLineNo">193</span>        future.complete(resp);<a name="line.193"></a>
<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
<span class="sourceLineNo">195</span>    });<a name="line.195"></a>
<span class="sourceLineNo">196</span>    return future;<a name="line.196"></a>
<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
<span class="sourceLineNo">198</span><a name="line.198"></a>
<span class="sourceLineNo">199</span>  private IOException badResponse(String debug) {<a name="line.199"></a>
<span class="sourceLineNo">200</span>    return new IOException(String.format("Invalid result for request %s. Will be retried", debug));<a name="line.200"></a>
<span class="sourceLineNo">201</span>  }<a name="line.201"></a>
<span class="sourceLineNo">202</span><a name="line.202"></a>
<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
<span class="sourceLineNo">204</span>   * send requests concurrently to hedgedReadsFanout masters. If any of the request is succeeded, we<a name="line.204"></a>
<span class="sourceLineNo">205</span>   * will complete the future and quit. If all the requests in one round are failed, we will start<a name="line.205"></a>
<span class="sourceLineNo">206</span>   * another round to send requests concurrently tohedgedReadsFanout masters. If all masters have<a name="line.206"></a>
<span class="sourceLineNo">207</span>   * been tried and all of them are failed, we will fail the future.<a name="line.207"></a>
<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
<span class="sourceLineNo">209</span>  private &lt;T extends Message&gt; void groupCall(CompletableFuture&lt;T&gt; future,<a name="line.209"></a>
<span class="sourceLineNo">210</span>      Set&lt;ServerName&gt; masterServers, List&lt;ClientMetaService.Interface&gt; masterStubs,<a name="line.210"></a>
<span class="sourceLineNo">211</span>      int startIndexInclusive, Callable&lt;T&gt; callable, Predicate&lt;T&gt; isValidResp, String debug,<a name="line.211"></a>
<span class="sourceLineNo">212</span>      ConcurrentLinkedQueue&lt;Throwable&gt; errors) {<a name="line.212"></a>
<span class="sourceLineNo">213</span>    int endIndexExclusive = Math.min(startIndexInclusive + hedgedReadFanOut, masterStubs.size());<a name="line.213"></a>
<span class="sourceLineNo">214</span>    AtomicInteger remaining = new AtomicInteger(endIndexExclusive - startIndexInclusive);<a name="line.214"></a>
<span class="sourceLineNo">215</span>    for (int i = startIndexInclusive; i &lt; endIndexExclusive; i++) {<a name="line.215"></a>
<span class="sourceLineNo">216</span>      addListener(call(masterStubs.get(i), callable), (r, e) -&gt; {<a name="line.216"></a>
<span class="sourceLineNo">217</span>        // a simple check to skip all the later operations earlier<a name="line.217"></a>
<span class="sourceLineNo">218</span>        if (future.isDone()) {<a name="line.218"></a>
<span class="sourceLineNo">219</span>          return;<a name="line.219"></a>
<span class="sourceLineNo">220</span>        }<a name="line.220"></a>
<span class="sourceLineNo">221</span>        if (e == null &amp;&amp; !isValidResp.test(r)) {<a name="line.221"></a>
<span class="sourceLineNo">222</span>          e = badResponse(debug);<a name="line.222"></a>
<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
<span class="sourceLineNo">224</span>        if (e != null) {<a name="line.224"></a>
<span class="sourceLineNo">225</span>          // make sure when remaining reaches 0 we have all exceptions in the errors queue<a name="line.225"></a>
<span class="sourceLineNo">226</span>          errors.add(e);<a name="line.226"></a>
<span class="sourceLineNo">227</span>          if (remaining.decrementAndGet() == 0) {<a name="line.227"></a>
<span class="sourceLineNo">228</span>            if (endIndexExclusive == masterStubs.size()) {<a name="line.228"></a>
<span class="sourceLineNo">229</span>              // we are done, complete the future with exception<a name="line.229"></a>
<span class="sourceLineNo">230</span>              RetriesExhaustedException ex = new RetriesExhaustedException("masters",<a name="line.230"></a>
<span class="sourceLineNo">231</span>                masterStubs.size(), new ArrayList&lt;&gt;(errors));<a name="line.231"></a>
<span class="sourceLineNo">232</span>              future.completeExceptionally(<a name="line.232"></a>
<span class="sourceLineNo">233</span>                new MasterRegistryFetchException(masterServers, ex));<a name="line.233"></a>
<span class="sourceLineNo">234</span>            } else {<a name="line.234"></a>
<span class="sourceLineNo">235</span>              groupCall(future, masterServers, masterStubs, endIndexExclusive, callable,<a name="line.235"></a>
<span class="sourceLineNo">236</span>                  isValidResp, debug, errors);<a name="line.236"></a>
<span class="sourceLineNo">237</span>            }<a name="line.237"></a>
<span class="sourceLineNo">238</span>          }<a name="line.238"></a>
<span class="sourceLineNo">239</span>        } else {<a name="line.239"></a>
<span class="sourceLineNo">240</span>          // do not need to decrement the counter any more as we have already finished the future.<a name="line.240"></a>
<span class="sourceLineNo">241</span>          future.complete(r);<a name="line.241"></a>
<span class="sourceLineNo">242</span>        }<a name="line.242"></a>
<span class="sourceLineNo">243</span>      });<a name="line.243"></a>
<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
<span class="sourceLineNo">246</span><a name="line.246"></a>
<span class="sourceLineNo">247</span>  private &lt;T extends Message&gt; CompletableFuture&lt;T&gt; call(Callable&lt;T&gt; callable,<a name="line.247"></a>
<span class="sourceLineNo">248</span>    Predicate&lt;T&gt; isValidResp, String debug) {<a name="line.248"></a>
<span class="sourceLineNo">249</span>    ImmutableMap&lt;ServerName, ClientMetaService.Interface&gt; masterAddr2StubRef = masterAddr2Stub;<a name="line.249"></a>
<span class="sourceLineNo">250</span>    Set&lt;ServerName&gt; masterServers = masterAddr2StubRef.keySet();<a name="line.250"></a>
<span class="sourceLineNo">251</span>    List&lt;ClientMetaService.Interface&gt; masterStubs = new ArrayList&lt;&gt;(masterAddr2StubRef.values());<a name="line.251"></a>
<span class="sourceLineNo">252</span>    Collections.shuffle(masterStubs, ThreadLocalRandom.current());<a name="line.252"></a>
<span class="sourceLineNo">253</span>    CompletableFuture&lt;T&gt; future = new CompletableFuture&lt;&gt;();<a name="line.253"></a>
<span class="sourceLineNo">254</span>    groupCall(future, masterServers, masterStubs, 0, callable, isValidResp, debug,<a name="line.254"></a>
<span class="sourceLineNo">255</span>        new ConcurrentLinkedQueue&lt;&gt;());<a name="line.255"></a>
<span class="sourceLineNo">256</span>    return future;<a name="line.256"></a>
<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
<span class="sourceLineNo">258</span><a name="line.258"></a>
<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
<span class="sourceLineNo">260</span>   * Simple helper to transform the result of getMetaRegionLocations() rpc.<a name="line.260"></a>
<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
<span class="sourceLineNo">262</span>  private static RegionLocations transformMetaRegionLocations(GetMetaRegionLocationsResponse resp) {<a name="line.262"></a>
<span class="sourceLineNo">263</span>    List&lt;HRegionLocation&gt; regionLocations = new ArrayList&lt;&gt;();<a name="line.263"></a>
<span class="sourceLineNo">264</span>    resp.getMetaLocationsList()<a name="line.264"></a>
<span class="sourceLineNo">265</span>      .forEach(location -&gt; regionLocations.add(ProtobufUtil.toRegionLocation(location)));<a name="line.265"></a>
<span class="sourceLineNo">266</span>    return new RegionLocations(regionLocations);<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>  @Override<a name="line.269"></a>
<span class="sourceLineNo">270</span>  public CompletableFuture&lt;RegionLocations&gt; getMetaRegionLocations() {<a name="line.270"></a>
<span class="sourceLineNo">271</span>    return this.&lt;GetMetaRegionLocationsResponse&gt; call((c, s, d) -&gt; s.getMetaRegionLocations(c,<a name="line.271"></a>
<span class="sourceLineNo">272</span>      GetMetaRegionLocationsRequest.getDefaultInstance(), d), r -&gt; r.getMetaLocationsCount() != 0,<a name="line.272"></a>
<span class="sourceLineNo">273</span>      "getMetaLocationsCount").thenApply(MasterRegistry::transformMetaRegionLocations);<a name="line.273"></a>
<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
<span class="sourceLineNo">275</span><a name="line.275"></a>
<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
<span class="sourceLineNo">277</span>  public CompletableFuture&lt;String&gt; getClusterId() {<a name="line.277"></a>
<span class="sourceLineNo">278</span>    return this<a name="line.278"></a>
<span class="sourceLineNo">279</span>      .&lt;GetClusterIdResponse&gt; call(<a name="line.279"></a>
<span class="sourceLineNo">280</span>        (c, s, d) -&gt; s.getClusterId(c, GetClusterIdRequest.getDefaultInstance(), d),<a name="line.280"></a>
<span class="sourceLineNo">281</span>        GetClusterIdResponse::hasClusterId, "getClusterId()")<a name="line.281"></a>
<span class="sourceLineNo">282</span>      .thenApply(GetClusterIdResponse::getClusterId);<a name="line.282"></a>
<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
<span class="sourceLineNo">284</span><a name="line.284"></a>
<span class="sourceLineNo">285</span>  private static boolean hasActiveMaster(GetMastersResponse resp) {<a name="line.285"></a>
<span class="sourceLineNo">286</span>    List&lt;GetMastersResponseEntry&gt; activeMasters =<a name="line.286"></a>
<span class="sourceLineNo">287</span>        resp.getMasterServersList().stream().filter(GetMastersResponseEntry::getIsActive).collect(<a name="line.287"></a>
<span class="sourceLineNo">288</span>        Collectors.toList());<a name="line.288"></a>
<span class="sourceLineNo">289</span>    return activeMasters.size() == 1;<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>  private static ServerName filterActiveMaster(GetMastersResponse resp) throws IOException {<a name="line.292"></a>
<span class="sourceLineNo">293</span>    List&lt;GetMastersResponseEntry&gt; activeMasters =<a name="line.293"></a>
<span class="sourceLineNo">294</span>        resp.getMasterServersList().stream().filter(GetMastersResponseEntry::getIsActive).collect(<a name="line.294"></a>
<span class="sourceLineNo">295</span>            Collectors.toList());<a name="line.295"></a>
<span class="sourceLineNo">296</span>    if (activeMasters.size() != 1) {<a name="line.296"></a>
<span class="sourceLineNo">297</span>      throw new IOException(String.format("Incorrect number of active masters encountered." +<a name="line.297"></a>
<span class="sourceLineNo">298</span>          " Expected: 1 found: %d. Content: %s", activeMasters.size(), activeMasters));<a name="line.298"></a>
<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
<span class="sourceLineNo">300</span>    return ProtobufUtil.toServerName(activeMasters.get(0).getServerName());<a name="line.300"></a>
<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
<span class="sourceLineNo">302</span><a name="line.302"></a>
<span class="sourceLineNo">303</span>  @Override<a name="line.303"></a>
<span class="sourceLineNo">304</span>  public CompletableFuture&lt;ServerName&gt; getActiveMaster() {<a name="line.304"></a>
<span class="sourceLineNo">305</span>    CompletableFuture&lt;ServerName&gt; future = new CompletableFuture&lt;&gt;();<a name="line.305"></a>
<span class="sourceLineNo">306</span>    addListener(call((c, s, d) -&gt; s.getMasters(c, GetMastersRequest.getDefaultInstance(), d),<a name="line.306"></a>
<span class="sourceLineNo">307</span>      MasterRegistry::hasActiveMaster, "getMasters()"), (resp, ex) -&gt; {<a name="line.307"></a>
<span class="sourceLineNo">308</span>        if (ex != null) {<a name="line.308"></a>
<span class="sourceLineNo">309</span>          future.completeExceptionally(ex);<a name="line.309"></a>
<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
<span class="sourceLineNo">311</span>        ServerName result = null;<a name="line.311"></a>
<span class="sourceLineNo">312</span>        try {<a name="line.312"></a>
<span class="sourceLineNo">313</span>          result = filterActiveMaster((GetMastersResponse)resp);<a name="line.313"></a>
<span class="sourceLineNo">314</span>        } catch (IOException e) {<a name="line.314"></a>
<span class="sourceLineNo">315</span>          future.completeExceptionally(e);<a name="line.315"></a>
<span class="sourceLineNo">316</span>        }<a name="line.316"></a>
<span class="sourceLineNo">317</span>        future.complete(result);<a name="line.317"></a>
<span class="sourceLineNo">318</span>      });<a name="line.318"></a>
<span class="sourceLineNo">319</span>    return future;<a name="line.319"></a>
<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
<span class="sourceLineNo">321</span><a name="line.321"></a>
<span class="sourceLineNo">322</span>  private static List&lt;ServerName&gt; transformServerNames(GetMastersResponse resp) {<a name="line.322"></a>
<span class="sourceLineNo">323</span>    return resp.getMasterServersList().stream().map(s -&gt; ProtobufUtil.toServerName(<a name="line.323"></a>
<span class="sourceLineNo">324</span>        s.getServerName())).collect(Collectors.toList());<a name="line.324"></a>
<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
<span class="sourceLineNo">326</span><a name="line.326"></a>
<span class="sourceLineNo">327</span>  CompletableFuture&lt;List&lt;ServerName&gt;&gt; getMasters() {<a name="line.327"></a>
<span class="sourceLineNo">328</span>    return this<a name="line.328"></a>
<span class="sourceLineNo">329</span>        .&lt;GetMastersResponse&gt; call((c, s, d) -&gt; s.getMasters(<a name="line.329"></a>
<span class="sourceLineNo">330</span>            c, GetMastersRequest.getDefaultInstance(), d), r -&gt; r.getMasterServersCount() != 0,<a name="line.330"></a>
<span class="sourceLineNo">331</span>            "getMasters()").thenApply(MasterRegistry::transformServerNames);<a name="line.331"></a>
<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
<span class="sourceLineNo">333</span><a name="line.333"></a>
<span class="sourceLineNo">334</span>  @VisibleForTesting<a name="line.334"></a>
<span class="sourceLineNo">335</span>  Set&lt;ServerName&gt; getParsedMasterServers() {<a name="line.335"></a>
<span class="sourceLineNo">336</span>    return masterAddr2Stub.keySet();<a name="line.336"></a>
<span class="sourceLineNo">337</span>  }<a name="line.337"></a>
<span class="sourceLineNo">338</span><a name="line.338"></a>
<span class="sourceLineNo">339</span>  @Override<a name="line.339"></a>
<span class="sourceLineNo">340</span>  public void close() {<a name="line.340"></a>
<span class="sourceLineNo">341</span>    if (masterAddressRefresher != null) {<a name="line.341"></a>
<span class="sourceLineNo">342</span>      masterAddressRefresher.close();<a name="line.342"></a>
<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
<span class="sourceLineNo">344</span>    if (rpcClient != null) {<a name="line.344"></a>
<span class="sourceLineNo">345</span>      rpcClient.close();<a name="line.345"></a>
<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
<span class="sourceLineNo">348</span>}<a name="line.348"></a>




























































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