http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2bf59208/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
----------------------------------------------------------------------
diff --git 
a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html 
b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
index dc4399b..a628974 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocator.html
@@ -26,148 +26,147 @@
 <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.TableName.META_TABLE_NAME;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import static 
org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.findException;<a 
name="line.21"></a>
-<span class="sourceLineNo">022</span>import static 
org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.isMetaClearingException;<a
 name="line.22"></a>
-<span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import 
org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer;<a 
name="line.24"></a>
-<span class="sourceLineNo">025</span>import 
org.apache.hbase.thirdparty.io.netty.util.Timeout;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><a name="line.26"></a>
-<span class="sourceLineNo">027</span>import 
java.util.concurrent.CompletableFuture;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.TimeUnit;<a 
name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.function.Consumer;<a 
name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.function.Function;<a 
name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.function.Supplier;<a 
name="line.31"></a>
-<span class="sourceLineNo">032</span><a name="line.32"></a>
-<span class="sourceLineNo">033</span>import 
org.apache.hadoop.hbase.HRegionLocation;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import 
org.apache.hadoop.hbase.TableName;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import 
org.apache.yetus.audience.InterfaceAudience;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.slf4j.Logger;<a 
name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.slf4j.LoggerFactory;<a 
name="line.37"></a>
-<span class="sourceLineNo">038</span>import 
org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import 
org.apache.hadoop.hbase.exceptions.TimeoutIOException;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import 
org.apache.hadoop.hbase.util.Bytes;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>/**<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * The asynchronous region locator.<a 
name="line.43"></a>
-<span class="sourceLineNo">044</span> */<a name="line.44"></a>
-<span class="sourceLineNo">045</span>@InterfaceAudience.Private<a 
name="line.45"></a>
-<span class="sourceLineNo">046</span>class AsyncRegionLocator {<a 
name="line.46"></a>
+<span class="sourceLineNo">021</span>import static 
org.apache.hadoop.hbase.util.FutureUtils.addListener;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import 
java.util.concurrent.CompletableFuture;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.concurrent.TimeUnit;<a 
name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.function.Supplier;<a 
name="line.25"></a>
+<span class="sourceLineNo">026</span>import 
org.apache.hadoop.hbase.HBaseIOException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import 
org.apache.hadoop.hbase.HRegionLocation;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import 
org.apache.hadoop.hbase.RegionException;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import 
org.apache.hadoop.hbase.RegionLocations;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import 
org.apache.hadoop.hbase.TableName;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import 
org.apache.hadoop.hbase.exceptions.TimeoutIOException;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import 
org.apache.hadoop.hbase.util.Bytes;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import 
org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a 
name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a 
name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import 
org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer;<a 
name="line.37"></a>
+<span class="sourceLineNo">038</span>import 
org.apache.hbase.thirdparty.io.netty.util.Timeout;<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>/**<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * The asynchronous region locator.<a 
name="line.41"></a>
+<span class="sourceLineNo">042</span> */<a name="line.42"></a>
+<span class="sourceLineNo">043</span>@InterfaceAudience.Private<a 
name="line.43"></a>
+<span class="sourceLineNo">044</span>class AsyncRegionLocator {<a 
name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private static final Logger LOG = 
LoggerFactory.getLogger(AsyncRegionLocator.class);<a name="line.46"></a>
 <span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final Logger LOG = 
LoggerFactory.getLogger(AsyncRegionLocator.class);<a name="line.48"></a>
+<span class="sourceLineNo">048</span>  private final HashedWheelTimer 
retryTimer;<a name="line.48"></a>
 <span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private final HashedWheelTimer 
retryTimer;<a name="line.50"></a>
+<span class="sourceLineNo">050</span>  private final AsyncMetaRegionLocator 
metaRegionLocator;<a name="line.50"></a>
 <span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private final AsyncMetaRegionLocator 
metaRegionLocator;<a name="line.52"></a>
+<span class="sourceLineNo">052</span>  private final AsyncNonMetaRegionLocator 
nonMetaRegionLocator;<a name="line.52"></a>
 <span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private final AsyncNonMetaRegionLocator 
nonMetaRegionLocator;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>  AsyncRegionLocator(AsyncConnectionImpl 
conn, HashedWheelTimer retryTimer) {<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    this.metaRegionLocator = new 
AsyncMetaRegionLocator(conn.registry);<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    this.nonMetaRegionLocator = new 
AsyncNonMetaRegionLocator(conn);<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    this.retryTimer = retryTimer;<a 
name="line.59"></a>
-<span class="sourceLineNo">060</span>  }<a name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private 
CompletableFuture&lt;HRegionLocation&gt; 
withTimeout(CompletableFuture&lt;HRegionLocation&gt; future,<a 
name="line.62"></a>
-<span class="sourceLineNo">063</span>      long timeoutNs, 
Supplier&lt;String&gt; timeoutMsg) {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    if (future.isDone() || timeoutNs 
&lt;= 0) {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      return future;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    }<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    Timeout timeoutTask = 
retryTimer.newTimeout(t -&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      if (future.isDone()) {<a 
name="line.68"></a>
-<span class="sourceLineNo">069</span>        return;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>      }<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      future.completeExceptionally(new 
TimeoutIOException(timeoutMsg.get()));<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    }, timeoutNs, 
TimeUnit.NANOSECONDS);<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    return future.whenComplete((loc, 
error) -&gt; {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      if (error != null &amp;&amp; 
error.getClass() != TimeoutIOException.class) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        // cancel timeout task if we are 
not completed by it.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        timeoutTask.cancel();<a 
name="line.76"></a>
-<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    });<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  
CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, 
byte[] row,<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      RegionLocateType type, boolean 
reload, long timeoutNs) {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    // meta region can not be split right 
now so we always call the same method.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    // Change it later if the meta table 
can have more than one regions.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    
CompletableFuture&lt;HRegionLocation&gt; future =<a name="line.85"></a>
-<span class="sourceLineNo">086</span>        tableName.equals(META_TABLE_NAME) 
? metaRegionLocator.getRegionLocation(reload)<a name="line.86"></a>
-<span class="sourceLineNo">087</span>            : 
nonMetaRegionLocator.getRegionLocation(tableName, row, type, reload);<a 
name="line.87"></a>
-<span class="sourceLineNo">088</span>    return withTimeout(future, 
timeoutNs,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      () -&gt; "Timeout(" + 
TimeUnit.NANOSECONDS.toMillis(timeoutNs) +<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          "ms) waiting for region 
location for " + tableName + ", row='" +<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          Bytes.toStringBinary(row) + 
"'");<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  
CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, 
byte[] row,<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      RegionLocateType type, long 
timeoutNs) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    return getRegionLocation(tableName, 
row, type, false, timeoutNs);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static boolean 
canUpdate(HRegionLocation loc, HRegionLocation oldLoc) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    // Do not need to update if no such 
location, or the location is newer, or the location is not<a 
name="line.100"></a>
-<span class="sourceLineNo">101</span>    // same with us<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return oldLoc != null &amp;&amp; 
oldLoc.getSeqNum() &lt;= loc.getSeqNum() &amp;&amp;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        
oldLoc.getServerName().equals(loc.getServerName());<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static void 
updateCachedLocation(HRegionLocation loc, Throwable exception,<a 
name="line.106"></a>
-<span class="sourceLineNo">107</span>      Function&lt;HRegionLocation, 
HRegionLocation&gt; cachedLocationSupplier,<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      Consumer&lt;HRegionLocation&gt; 
addToCache, Consumer&lt;HRegionLocation&gt; removeFromCache) {<a 
name="line.108"></a>
-<span class="sourceLineNo">109</span>    HRegionLocation oldLoc = 
cachedLocationSupplier.apply(loc);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    if (LOG.isDebugEnabled()) {<a 
name="line.110"></a>
-<span class="sourceLineNo">111</span>      LOG.debug("Try updating " + loc + 
", the old value is " + oldLoc, exception);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    if (!canUpdate(loc, oldLoc)) {<a 
name="line.113"></a>
-<span class="sourceLineNo">114</span>      return;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    Throwable cause = 
findException(exception);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    if (LOG.isDebugEnabled()) {<a 
name="line.117"></a>
-<span class="sourceLineNo">118</span>      LOG.debug("The actual exception 
when updating " + loc, cause);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (cause == null || 
!isMetaClearingException(cause)) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      if (LOG.isDebugEnabled()) {<a 
name="line.121"></a>
-<span class="sourceLineNo">122</span>        LOG.debug(<a name="line.122"></a>
-<span class="sourceLineNo">123</span>          "Will not update " + loc + " 
because the exception is null or not the one we care about");<a 
name="line.123"></a>
-<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    if (cause instanceof 
RegionMovedException) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      RegionMovedException rme = 
(RegionMovedException) cause;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      HRegionLocation newLoc =<a 
name="line.129"></a>
-<span class="sourceLineNo">130</span>          new 
HRegionLocation(loc.getRegionInfo(), rme.getServerName(), 
rme.getLocationSeqNum());<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      if (LOG.isDebugEnabled()) {<a 
name="line.131"></a>
-<span class="sourceLineNo">132</span>        LOG.debug(<a name="line.132"></a>
-<span class="sourceLineNo">133</span>          "Try updating " + loc + " with 
the new location " + newLoc + " constructed by " + rme);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      addToCache.accept(newLoc);<a 
name="line.135"></a>
-<span class="sourceLineNo">136</span>    } else {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      if (LOG.isDebugEnabled()) {<a 
name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.debug("Try removing " + loc + 
" from cache");<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      removeFromCache.accept(loc);<a 
name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  void 
updateCachedLocation(HRegionLocation loc, Throwable exception) {<a 
name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (loc.getRegion().isMetaRegion()) 
{<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      
metaRegionLocator.updateCachedLocation(loc, exception);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    } else {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      
nonMetaRegionLocator.updateCachedLocation(loc, exception);<a 
name="line.148"></a>
-<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  void clearCache(TableName tableName) 
{<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    if (LOG.isDebugEnabled()) {<a 
name="line.153"></a>
-<span class="sourceLineNo">154</span>      LOG.debug("Clear meta cache for " + 
tableName);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    if 
(tableName.equals(META_TABLE_NAME)) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      metaRegionLocator.clearCache();<a 
name="line.157"></a>
-<span class="sourceLineNo">158</span>    } else {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      
nonMetaRegionLocator.clearCache(tableName);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>}<a name="line.162"></a>
+<span class="sourceLineNo">054</span>  AsyncRegionLocator(AsyncConnectionImpl 
conn, HashedWheelTimer retryTimer) {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    this.metaRegionLocator = new 
AsyncMetaRegionLocator(conn.registry);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    this.nonMetaRegionLocator = new 
AsyncNonMetaRegionLocator(conn);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    this.retryTimer = retryTimer;<a 
name="line.57"></a>
+<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private &lt;T&gt; 
CompletableFuture&lt;T&gt; withTimeout(CompletableFuture&lt;T&gt; future, long 
timeoutNs,<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      Supplier&lt;String&gt; timeoutMsg) 
{<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    if (future.isDone() || timeoutNs 
&lt;= 0) {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      return future;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    Timeout timeoutTask = 
retryTimer.newTimeout(t -&gt; {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      if (future.isDone()) {<a 
name="line.66"></a>
+<span class="sourceLineNo">067</span>        return;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      }<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      future.completeExceptionally(new 
TimeoutIOException(timeoutMsg.get()));<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    }, timeoutNs, 
TimeUnit.NANOSECONDS);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    return future.whenComplete((loc, 
error) -&gt; {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      if (error != null &amp;&amp; 
error.getClass() != TimeoutIOException.class) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        // cancel timeout task if we are 
not completed by it.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        timeoutTask.cancel();<a 
name="line.74"></a>
+<span class="sourceLineNo">075</span>      }<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    });<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private boolean isMeta(TableName 
tableName) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    return 
TableName.isMetaTableName(tableName);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  
CompletableFuture&lt;RegionLocations&gt; getRegionLocations(TableName 
tableName, byte[] row,<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      RegionLocateType type, boolean 
reload, long timeoutNs) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    
CompletableFuture&lt;RegionLocations&gt; future = isMeta(tableName)<a 
name="line.85"></a>
+<span class="sourceLineNo">086</span>      ? 
metaRegionLocator.getRegionLocations(RegionReplicaUtil.DEFAULT_REPLICA_ID, 
reload)<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      : 
nonMetaRegionLocator.getRegionLocations(tableName, row,<a name="line.87"></a>
+<span class="sourceLineNo">088</span>        
RegionReplicaUtil.DEFAULT_REPLICA_ID, type, reload);<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    return withTimeout(future, 
timeoutNs,<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      () -&gt; "Timeout(" + 
TimeUnit.NANOSECONDS.toMillis(timeoutNs) +<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        "ms) waiting for region locations 
for " + tableName + ", row='" +<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        Bytes.toStringBinary(row) + 
"'");<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>  
CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, 
byte[] row,<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      int replicaId, RegionLocateType 
type, boolean reload, long timeoutNs) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    // meta region can not be split right 
now so we always call the same method.<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    // Change it later if the meta table 
can have more than one regions.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    
CompletableFuture&lt;HRegionLocation&gt; future = new 
CompletableFuture&lt;&gt;();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    
CompletableFuture&lt;RegionLocations&gt; locsFuture =<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      isMeta(tableName) ? 
metaRegionLocator.getRegionLocations(replicaId, reload)<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        : 
nonMetaRegionLocator.getRegionLocations(tableName, row, replicaId, type, 
reload);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    addListener(locsFuture, (locs, error) 
-&gt; {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      if (error != null) {<a 
name="line.104"></a>
+<span class="sourceLineNo">105</span>        
future.completeExceptionally(error);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        return;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      HRegionLocation loc = 
locs.getRegionLocation(replicaId);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      if (loc == null) {<a 
name="line.109"></a>
+<span class="sourceLineNo">110</span>        future<a name="line.110"></a>
+<span class="sourceLineNo">111</span>          .completeExceptionally(new 
RegionException("No location for " + tableName + ", row='" +<a 
name="line.111"></a>
+<span class="sourceLineNo">112</span>            Bytes.toStringBinary(row) + 
"', locateType=" + type + ", replicaId=" + replicaId));<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      } else if (loc.getServerName() == 
null) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        future.completeExceptionally(new 
HBaseIOException("No server address listed for region '" +<a 
name="line.114"></a>
+<span class="sourceLineNo">115</span>          
loc.getRegion().getRegionNameAsString() + ", row='" + Bytes.toStringBinary(row) 
+<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          "', locateType=" + type + ", 
replicaId=" + replicaId));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      } else {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        future.complete(loc);<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>    return withTimeout(future, 
timeoutNs,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      () -&gt; "Timeout(" + 
TimeUnit.NANOSECONDS.toMillis(timeoutNs) +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        "ms) waiting for region location 
for " + tableName + ", row='" + Bytes.toStringBinary(row) +<a 
name="line.123"></a>
+<span class="sourceLineNo">124</span>        "', replicaId=" + replicaId);<a 
name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  
CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, 
byte[] row,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      int replicaId, RegionLocateType 
type, long timeoutNs) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    return getRegionLocation(tableName, 
row, replicaId, type, false, timeoutNs);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  
CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, 
byte[] row,<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      RegionLocateType type, boolean 
reload, long timeoutNs) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    return getRegionLocation(tableName, 
row, RegionReplicaUtil.DEFAULT_REPLICA_ID, type, reload,<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      timeoutNs);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  
CompletableFuture&lt;HRegionLocation&gt; getRegionLocation(TableName tableName, 
byte[] row,<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      RegionLocateType type, long 
timeoutNs) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    return getRegionLocation(tableName, 
row, type, false, timeoutNs);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  void 
updateCachedLocationOnError(HRegionLocation loc, Throwable exception) {<a 
name="line.143"></a>
+<span class="sourceLineNo">144</span>    if (loc.getRegion().isMetaRegion()) 
{<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      
metaRegionLocator.updateCachedLocationOnError(loc, exception);<a 
name="line.145"></a>
+<span class="sourceLineNo">146</span>    } else {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      
nonMetaRegionLocator.updateCachedLocationOnError(loc, exception);<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><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  void clearCache(TableName tableName) 
{<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    if (LOG.isDebugEnabled()) {<a 
name="line.152"></a>
+<span class="sourceLineNo">153</span>      LOG.debug("Clear meta cache for " + 
tableName);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    if 
(tableName.equals(META_TABLE_NAME)) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      metaRegionLocator.clearCache();<a 
name="line.156"></a>
+<span class="sourceLineNo">157</span>    } else {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      
nonMetaRegionLocator.clearCache(tableName);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
+<span class="sourceLineNo">161</span>}<a name="line.161"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2bf59208/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.html
----------------------------------------------------------------------
diff --git 
a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.html
 
b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.html
new file mode 100644
index 0000000..08d9716
--- /dev/null
+++ 
b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRegionLocatorHelper.html
@@ -0,0 +1,219 @@
+<!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.exceptions.ClientExceptionsUtil.findException;<a 
name="line.20"></a>
+<span class="sourceLineNo">021</span>import static 
org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.isMetaClearingException;<a
 name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Arrays;<a 
name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.function.Consumer;<a 
name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.function.Function;<a 
name="line.25"></a>
+<span class="sourceLineNo">026</span>import 
org.apache.commons.lang3.ObjectUtils;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import 
org.apache.hadoop.hbase.HRegionLocation;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import 
org.apache.hadoop.hbase.RegionLocations;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import 
org.apache.hadoop.hbase.exceptions.RegionMovedException;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import 
org.apache.yetus.audience.InterfaceAudience;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.slf4j.Logger;<a 
name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.slf4j.LoggerFactory;<a 
name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * Helper class for asynchronous region 
locator.<a name="line.35"></a>
+<span class="sourceLineNo">036</span> */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>@InterfaceAudience.Private<a 
name="line.37"></a>
+<span class="sourceLineNo">038</span>final class AsyncRegionLocatorHelper {<a 
name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>  private static final Logger LOG = 
LoggerFactory.getLogger(AsyncRegionLocatorHelper.class);<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  private AsyncRegionLocatorHelper() {<a 
name="line.42"></a>
+<span class="sourceLineNo">043</span>  }<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  static boolean 
canUpdateOnError(HRegionLocation loc, HRegionLocation oldLoc) {<a 
name="line.45"></a>
+<span class="sourceLineNo">046</span>    // Do not need to update if no such 
location, or the location is newer, or the location is not<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    // the same with us<a 
name="line.47"></a>
+<span class="sourceLineNo">048</span>    return oldLoc != null &amp;&amp; 
oldLoc.getSeqNum() &lt;= loc.getSeqNum() &amp;&amp;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>      
oldLoc.getServerName().equals(loc.getServerName());<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  }<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  static void 
updateCachedLocationOnError(HRegionLocation loc, Throwable exception,<a 
name="line.52"></a>
+<span class="sourceLineNo">053</span>      Function&lt;HRegionLocation, 
HRegionLocation&gt; cachedLocationSupplier,<a name="line.53"></a>
+<span class="sourceLineNo">054</span>      Consumer&lt;HRegionLocation&gt; 
addToCache, Consumer&lt;HRegionLocation&gt; removeFromCache) {<a 
name="line.54"></a>
+<span class="sourceLineNo">055</span>    HRegionLocation oldLoc = 
cachedLocationSupplier.apply(loc);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    LOG.debug("Try updating {} , the old 
value is {}", loc, oldLoc, exception);<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    if (!canUpdateOnError(loc, oldLoc)) 
{<a name="line.57"></a>
+<span class="sourceLineNo">058</span>      return;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    Throwable cause = 
findException(exception);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    LOG.debug("The actual exception when 
updating {}", loc, cause);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    if (cause == null || 
!isMetaClearingException(cause)) {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      LOG.debug("Will not update {} 
because the exception is null or not the one we care about",<a 
name="line.63"></a>
+<span class="sourceLineNo">064</span>        loc);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      return;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    }<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    if (cause instanceof 
RegionMovedException) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      RegionMovedException rme = 
(RegionMovedException) cause;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      HRegionLocation newLoc =<a 
name="line.69"></a>
+<span class="sourceLineNo">070</span>        new 
HRegionLocation(loc.getRegion(), rme.getServerName(), 
rme.getLocationSeqNum());<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      LOG.debug("Try updating {} with the 
new location {} constructed by {}", loc, newLoc, rme);<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      addToCache.accept(newLoc);<a 
name="line.72"></a>
+<span class="sourceLineNo">073</span>    } else {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>      LOG.debug("Try removing {} from 
cache", loc);<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      removeFromCache.accept(loc);<a 
name="line.75"></a>
+<span class="sourceLineNo">076</span>    }<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  static RegionLocations 
createRegionLocations(HRegionLocation loc) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    int replicaId = 
loc.getRegion().getReplicaId();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    HRegionLocation[] locs = new 
HRegionLocation[replicaId + 1];<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    locs[replicaId] = loc;<a 
name="line.82"></a>
+<span class="sourceLineNo">083</span>    return new RegionLocations(locs);<a 
name="line.83"></a>
+<span class="sourceLineNo">084</span>  }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * Create a new {@link RegionLocations} 
based on the given {@code oldLocs}, and replace the<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * location for the given {@code 
replicaId} with the given {@code loc}.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * &lt;p/&gt;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * All the {@link RegionLocations} in 
async locator related class are immutable because we want to<a 
name="line.90"></a>
+<span class="sourceLineNo">091</span>   * access them concurrently, so here we 
need to create a new one, instead of calling<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * {@link 
RegionLocations#updateLocation(HRegionLocation, boolean, boolean)}.<a 
name="line.92"></a>
+<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  static RegionLocations 
replaceRegionLocation(RegionLocations oldLocs, HRegionLocation loc) {<a 
name="line.94"></a>
+<span class="sourceLineNo">095</span>    int replicaId = 
loc.getRegion().getReplicaId();<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    HRegionLocation[] locs = 
oldLocs.getRegionLocations();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    locs = Arrays.copyOf(locs, 
Math.max(replicaId + 1, locs.length));<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    locs[replicaId] = loc;<a 
name="line.98"></a>
+<span class="sourceLineNo">099</span>    return new RegionLocations(locs);<a 
name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  /**<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * Create a new {@link RegionLocations} 
based on the given {@code oldLocs}, and remove the<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * location for the given {@code 
replicaId}.<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * &lt;p/&gt;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * All the {@link RegionLocations} in 
async locator related class are immutable because we want to<a 
name="line.106"></a>
+<span class="sourceLineNo">107</span>   * access them concurrently, so here we 
need to create a new one, instead of calling<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * {@link 
RegionLocations#remove(int)}.<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  static RegionLocations 
removeRegionLocation(RegionLocations oldLocs, int replicaId) {<a 
name="line.110"></a>
+<span class="sourceLineNo">111</span>    HRegionLocation[] locs = 
oldLocs.getRegionLocations();<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    if (locs.length &lt; replicaId + 1) 
{<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      // Here we do not modify the 
oldLocs so it is safe to return it.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      return oldLocs;<a 
name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    locs = Arrays.copyOf(locs, 
locs.length);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    locs[replicaId] = null;<a 
name="line.117"></a>
+<span class="sourceLineNo">118</span>    if (ObjectUtils.firstNonNull(locs) != 
null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      return new RegionLocations(locs);<a 
name="line.119"></a>
+<span class="sourceLineNo">120</span>    } else {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      // if all the locations are null, 
just return null<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      return null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  /**<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * Create a new {@link RegionLocations} 
which is the merging result for the given two<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * {@link RegionLocations}.<a 
name="line.128"></a>
+<span class="sourceLineNo">129</span>   * &lt;p/&gt;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * All the {@link RegionLocations} in 
async locator related class are immutable because we want to<a 
name="line.130"></a>
+<span class="sourceLineNo">131</span>   * access them concurrently, so here we 
need to create a new one, instead of calling<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * {@link 
RegionLocations#mergeLocations(RegionLocations)} directly.<a 
name="line.132"></a>
+<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static RegionLocations 
mergeRegionLocations(RegionLocations newLocs, RegionLocations oldLocs) {<a 
name="line.134"></a>
+<span class="sourceLineNo">135</span>    RegionLocations locs = new 
RegionLocations(newLocs.getRegionLocations());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    locs.mergeLocations(oldLocs);<a 
name="line.136"></a>
+<span class="sourceLineNo">137</span>    return locs;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  static boolean isGood(RegionLocations 
locs, int replicaId) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    if (locs == null) {<a 
name="line.141"></a>
+<span class="sourceLineNo">142</span>      return false;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    HRegionLocation loc = 
locs.getRegionLocation(replicaId);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    return loc != null &amp;&amp; 
loc.getServerName() != null;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
+<span class="sourceLineNo">147</span>}<a name="line.147"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2bf59208/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRpcRetryingCaller.html
----------------------------------------------------------------------
diff --git 
a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRpcRetryingCaller.html
 
b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRpcRetryingCaller.html
index 92e13cb..f6ec724 100644
--- 
a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRpcRetryingCaller.html
+++ 
b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncRpcRetryingCaller.html
@@ -96,15 +96,15 @@
 <span class="sourceLineNo">088</span>    return 
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);<a 
name="line.88"></a>
 <span class="sourceLineNo">089</span>  }<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  protected long remainingTimeNs() {<a 
name="line.91"></a>
+<span class="sourceLineNo">091</span>  protected final long remainingTimeNs() 
{<a name="line.91"></a>
 <span class="sourceLineNo">092</span>    return operationTimeoutNs - 
(System.nanoTime() - startNs);<a name="line.92"></a>
 <span class="sourceLineNo">093</span>  }<a name="line.93"></a>
 <span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  protected void completeExceptionally() 
{<a name="line.95"></a>
+<span class="sourceLineNo">095</span>  protected final void 
completeExceptionally() {<a name="line.95"></a>
 <span class="sourceLineNo">096</span>    future.completeExceptionally(new 
RetriesExhaustedException(tries - 1, exceptions));<a name="line.96"></a>
 <span class="sourceLineNo">097</span>  }<a name="line.97"></a>
 <span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  protected void resetCallTimeout() {<a 
name="line.99"></a>
+<span class="sourceLineNo">099</span>  protected final void resetCallTimeout() 
{<a name="line.99"></a>
 <span class="sourceLineNo">100</span>    long callTimeoutNs;<a 
name="line.100"></a>
 <span class="sourceLineNo">101</span>    if (operationTimeoutNs &gt; 0) {<a 
name="line.101"></a>
 <span class="sourceLineNo">102</span>      callTimeoutNs = 
remainingTimeNs();<a name="line.102"></a>
@@ -119,48 +119,55 @@
 <span class="sourceLineNo">111</span>    resetController(controller, 
callTimeoutNs);<a name="line.111"></a>
 <span class="sourceLineNo">112</span>  }<a name="line.112"></a>
 <span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  protected void onError(Throwable error, 
Supplier&lt;String&gt; errMsg,<a name="line.114"></a>
+<span class="sourceLineNo">114</span>  protected final void onError(Throwable 
error, Supplier&lt;String&gt; errMsg,<a name="line.114"></a>
 <span class="sourceLineNo">115</span>      Consumer&lt;Throwable&gt; 
updateCachedLocation) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    error = translateException(error);<a 
name="line.116"></a>
-<span class="sourceLineNo">117</span>    if (error instanceof 
DoNotRetryIOException) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      
future.completeExceptionally(error);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      return;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    if (tries &gt; startLogErrorsCnt) {<a 
name="line.121"></a>
-<span class="sourceLineNo">122</span>      LOG.warn(errMsg.get() + ", tries = 
" + tries + ", maxAttempts = " + maxAttempts<a name="line.122"></a>
-<span class="sourceLineNo">123</span>          + ", timeout = " + 
TimeUnit.NANOSECONDS.toMillis(operationTimeoutNs)<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          + " ms, time elapsed = " + 
elapsedMs() + " ms", error);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    
RetriesExhaustedException.ThrowableWithExtraContext qt = new 
RetriesExhaustedException.ThrowableWithExtraContext(<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        error, 
EnvironmentEdgeManager.currentTime(), "");<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    exceptions.add(qt);<a 
name="line.128"></a>
-<span class="sourceLineNo">129</span>    if (tries &gt;= maxAttempts) {<a 
name="line.129"></a>
-<span class="sourceLineNo">130</span>      completeExceptionally();<a 
name="line.130"></a>
-<span class="sourceLineNo">131</span>      return;<a name="line.131"></a>
+<span class="sourceLineNo">116</span>    if (future.isDone()) {<a 
name="line.116"></a>
+<span class="sourceLineNo">117</span>      // Give up if the future is already 
done, this is possible if user has already canceled the<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      // future. And for timeline 
consistent read, we will also cancel some requests if we have<a 
name="line.118"></a>
+<span class="sourceLineNo">119</span>      // already get one of the 
responses.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      LOG.debug("The future is already 
done, canceled={}, give up retrying", future.isCancelled());<a 
name="line.120"></a>
+<span class="sourceLineNo">121</span>      return;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    error = translateException(error);<a 
name="line.123"></a>
+<span class="sourceLineNo">124</span>    if (error instanceof 
DoNotRetryIOException) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      
future.completeExceptionally(error);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      return;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    if (tries &gt; startLogErrorsCnt) {<a 
name="line.128"></a>
+<span class="sourceLineNo">129</span>      LOG.warn(errMsg.get() + ", tries = 
" + tries + ", maxAttempts = " + maxAttempts<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          + ", timeout = " + 
TimeUnit.NANOSECONDS.toMillis(operationTimeoutNs)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          + " ms, time elapsed = " + 
elapsedMs() + " ms", error);<a name="line.131"></a>
 <span class="sourceLineNo">132</span>    }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    long delayNs;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    if (operationTimeoutNs &gt; 0) {<a 
name="line.134"></a>
-<span class="sourceLineNo">135</span>      long maxDelayNs = remainingTimeNs() 
- SLEEP_DELTA_NS;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (maxDelayNs &lt;= 0) {<a 
name="line.136"></a>
-<span class="sourceLineNo">137</span>        completeExceptionally();<a 
name="line.137"></a>
-<span class="sourceLineNo">138</span>        return;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      delayNs = Math.min(maxDelayNs, 
getPauseTime(pauseNs, tries - 1));<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    } else {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      delayNs = getPauseTime(pauseNs, 
tries - 1);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    updateCachedLocation.accept(error);<a 
name="line.144"></a>
-<span class="sourceLineNo">145</span>    tries++;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    retryTimer.newTimeout(t -&gt; 
doCall(), delayNs, TimeUnit.NANOSECONDS);<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>  protected abstract void doCall();<a 
name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  CompletableFuture&lt;T&gt; call() {<a 
name="line.151"></a>
-<span class="sourceLineNo">152</span>    doCall();<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return future;<a name="line.153"></a>
+<span class="sourceLineNo">133</span>    
RetriesExhaustedException.ThrowableWithExtraContext qt = new 
RetriesExhaustedException.ThrowableWithExtraContext(<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        error, 
EnvironmentEdgeManager.currentTime(), "");<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    exceptions.add(qt);<a 
name="line.135"></a>
+<span class="sourceLineNo">136</span>    if (tries &gt;= maxAttempts) {<a 
name="line.136"></a>
+<span class="sourceLineNo">137</span>      completeExceptionally();<a 
name="line.137"></a>
+<span class="sourceLineNo">138</span>      return;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    long delayNs;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    if (operationTimeoutNs &gt; 0) {<a 
name="line.141"></a>
+<span class="sourceLineNo">142</span>      long maxDelayNs = remainingTimeNs() 
- SLEEP_DELTA_NS;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      if (maxDelayNs &lt;= 0) {<a 
name="line.143"></a>
+<span class="sourceLineNo">144</span>        completeExceptionally();<a 
name="line.144"></a>
+<span class="sourceLineNo">145</span>        return;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      }<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      delayNs = Math.min(maxDelayNs, 
getPauseTime(pauseNs, tries - 1));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    } else {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      delayNs = getPauseTime(pauseNs, 
tries - 1);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    updateCachedLocation.accept(error);<a 
name="line.151"></a>
+<span class="sourceLineNo">152</span>    tries++;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    retryTimer.newTimeout(t -&gt; 
doCall(), delayNs, TimeUnit.NANOSECONDS);<a name="line.153"></a>
 <span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>}<a name="line.155"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  protected abstract void doCall();<a 
name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  CompletableFuture&lt;T&gt; call() {<a 
name="line.158"></a>
+<span class="sourceLineNo">159</span>    doCall();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    return future;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>}<a name="line.162"></a>
 
 
 

Reply via email to